String和C#中的string有什么区别?
示例(注意情况):
string s = "Hello world!"; String s = "Hello world!";
每种使用的准则是什么?有什么区别?
解决方案
回答
字符串是Cfor System.String中的别名。
因此,从技术上讲,没有区别。就像int
与System.Int32
一样。
就准则而言,通常建议我们在每次引用对象时都使用"字符串"。
例如
string place = "world";
同样,我认为如果需要专门引用该类,通常建议使用String
。
例如
string greet = String.Format("Hello {0}!", place);
这是Microsoft倾向于在示例中使用的样式。
似乎该区域中的指南可能已更改,因为StyleCop现在强制使用Cspecific别名。
回答
System.String是C中的.NET字符串类。string是System.String的别名,因此在使用中它们是相同的。
至于指导方针,我不会陷入困境,只要使用任何我们觉得生活中还有更重要的事情的东西,无论如何代码都将是相同的。
如果我们发现自己需要指定要使用的整数大小的构建系统,因此倾向于使用Int16,Int32,UInt16,UInt32等,那么使用起来似乎更自然字符串,当在不同的.net语言之间移动时,它可能会使事情更容易理解,否则我将使用字符串和整数。
回答
小写的字符串是System.String的别名。
它们在C#
中是相同的。
关于是否应该使用系统类型(" System.Int32"," System.String"等)或者" Caliases"(" int"," string"等)存在争议。我个人认为我们应该使用"别名",但这只是我个人的偏爱。
回答
Jeffrey Richter在他的书CLR Via C#中听说过关于在Ccomes中使用提供的类型别名的最佳答案。这是他的3个原因:
I've seen a number of developers confused, not knowing whether to use string or String in their code. Because in C# the string (a keyword) maps exactly to System.String (an FCL type), there is no difference and either can be used. In C#, long maps to System.Int64, but in a different programming language, long could map to an Int16 or Int32. In fact, C++/CLI does in fact treat long as an Int32. Someone reading source code in one language could easily misinterpret the code's intention if he or she were used to programming in a different programming language. In fact, most languages won't even treat long as a keyword and won't compile code that uses it. The FCL has many methods that have type names as part of their method names. For example, the BinaryReader type offers methods such as ReadBoolean, ReadInt32, ReadSingle, and so on, and the System.Convert type offers methods such as ToBoolean, ToInt32, ToSingle, and so on. Although it's legal to write the following code, the line with float feels very unnatural to me, and it's not obvious that the line is correct:
BinaryReader br = new BinaryReader(...); float val = br.ReadSingle(); // OK, but feels unnatural Single val = br.ReadSingle(); // OK and feels good
所以你有它。我认为这些都是非常好的要点。但是,我发现自己没有在自己的代码中使用Jeffrey的建议。也许我对Cworld太过困惑,但最终还是试图使我的代码看起来像框架代码。
回答
确实,这是惯例问题。 "字符串"看起来更像C / C ++样式。一般约定是使用所选语言提供的任何快捷方式(对于Int32,为in / Int)。这同样适用于"对象"和"十进制"。
从理论上讲,这可以帮助将代码移植到将来的64位标准中,其中" int"可能表示Int64,但这不是重点,我希望任何升级向导都可以将对" Int32"的任何" int"引用都更改为注意安全。
回答
事先不使用"系统"就不能使用"字符串"是一个区别。
回答
由于格式化的原因,我更喜欢使用大写的.NET类型(而不是别名)。 .NET类型的颜色与其他对象类型相同(毕竟,值类型是正确的对象)。
条件和控制关键字(如" if"," switch"和" return")为小写字母,颜色为深蓝色(默认情况下)。我宁愿在使用和格式方面没有分歧。
考虑:
String someString; string anotherString;
回答
如果我们喜欢使用System类型,则可以更轻松地在Cand VB.Net之间进行移植。
回答
字符串和字符串在所有方面都是相同的(大写的" S"除外)。两种方式都不会影响性能。
在大多数项目中,由于语法突出显示,小写的" string"是首选
回答
字符串只是System.String的别名。编译器将对它们进行相同的处理。
唯一实际的不同是我们提到的语法突出显示,如果使用String
,则必须使用System写。
回答
" String"代表" System.String",它是.NET Framework类型。字符串是System.String语言中的别名。它们都被IL(中间语言)编译为System.String
,所以没有区别。选择我们喜欢的东西并使用它。如果我们使用C#编写代码,则我更喜欢string
,因为它是Ctype别名,并且为Cprogrammers所熟知。
我可以对(int
,System.Int32
)等说同样的话。
回答
两者都一样。但是从编码准则的角度来看,最好使用"字符串"而不是"字符串"。这是开发人员通常使用的。例如而不是使用Int32,而是使用int,因为int是Int32的别名。
供参考
关键字字符串只是预定义类" System.String"的别名。语言规范4.2.3
http://msdn2.microsoft.com/En-US/library/aa691153.aspx
回答
只是为了完整起见,以下是相关信息的摘要……
正如其他人指出的那样," string"是" System.String"的别名。它们编译为相同的代码,因此在执行时没有任何区别。这只是C#中的别名之一。完整的列表是:
object: System.Object string: System.String bool: System.Boolean byte: System.Byte sbyte: System.SByte short: System.Int16 ushort: System.UInt16 int: System.Int32 uint: System.UInt32 long: System.Int64 ulong: System.UInt64 float: System.Single double: System.Double decimal: System.Decimal char: System.Char
除了"字符串"和"对象"之外,别名都是值类型。小数是一种值类型,但不是CLR中的原始类型。没有别名的唯一基本类型是System.IntPtr
。
在规范中,值类型别名称为"简单类型"。文字可用于每种简单类型的常量值;没有其他值类型具有文字形式可用。 (将此与VB进行比较,VB允许使用" DateTime"字面量,并且也具有别名)。
在一种情况下,我们必须使用别名:在显式指定枚举的基础类型时。例如:
public enum Foo : UInt32 {} // Invalid public enum Bar : uint {} // Valid
这只是规范定义枚举声明的方式的问题,冒号之后的部分必须是整数类型的生产,这是sbyte
,byte
,short
,ushort
,int的一个标记。 ,
uint,
long,
ulong,
char` ...,例如,与变量声明所使用的类型生产相反。它并不表示其他任何区别。
最后,涉及到使用什么:我个人在实现时都使用别名,但对于任何API均使用CLR类型。就团队之间的实现一致性而言,使用哪种关系真的没什么大不了,但是没有人会在意。另一方面,真正重要的是,如果我们在API中引用类型,则必须以语言无关的方式进行。名为" ReadInt32"的方法是明确的,而名为" ReadInt"的方法则需要解释。例如,调用者可能使用的语言为Int16定义了一个int别名。 .NET框架设计人员遵循了这种模式,BitConverter,BinaryReader和Convert类中就是很好的例子。
回答
上面已经讲过了;但是,我们不能在反射中使用string
;我们必须使用String
。
回答
正如其他人所说,它们是相同的。默认情况下,StyleCop规则会强制我们将string用作Ccode样式的最佳实践,除非引用System.String静态函数,例如String.Format,String.Join和String.Concat。 `等
回答
字符串是一个保留字,而字符串只是一个类名。
这意味着string
本身不能用作变量名。
如果由于某种原因我们想要一个名为string的变量,那么我们只会看到以下第一个编译:
StringBuilder String = new StringBuilder(); // compiles StringBuilder string = new StringBuilder(); // doesn't compile
如果我们确实想要一个名为string的变量名,则可以使用@
作为前缀:
StringBuilder @string = new StringBuilder();
另一个重要的区别:堆栈溢出以不同的方式突出显示它们。
回答
与CLR一起使用的一种语言。
字符串是C#中的一种类型。
System.String是CLR中的一种类型。
当我们将Ctogether与CLR一起使用时," string"将被映射到" System.String"。
从理论上讲,我们可以实现一个生成Java字节码的C#编译器。为了与Java运行时库进行互操作,此编译器的明智实现可能会将" string"映射到" java.lang.String"。