这两者之间有什么不同,我应该使用哪一个?
string s = "Hello world!";
String s = "Hello world!";
string
在 C# 中是 System.String
的别名。
因此,在技术上,它们没有任何区别。这就像 int
vs. System.Int32
一样。
至于指南,通常建议在引用对象时使用 string
。
例如:
string place = "world";
同样地,我认为通常建议使用String
来特别指代这个类。
例如:
string greet = String.Format("Hello {0}!", place);
看起来,这方面的指导可能已经发生了变化,因为StyleCop现在强制使用特定于 C# 的别名。
为了充分说明问题,以下是相关信息的大脑转储...
正如其他人所指出的那样,string
是 System.String
的别名。假设您的代码使用 String
编译成 System.String
(即您没有使用不同 String
类型的某些其他命名空间的 using 指令),它们编译为相同的代码,因此在执行时没有任何区别。这只是 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
除了string
和object
,所有的别名都是值类型。 decimal
是一个值类型,但不是CLR中的原始类型。唯一没有别名的原始类型是System.IntPtr
。
在规范中,值类型别名被称为“简单类型”。字面量可以用于每个简单类型的常量值;其他值类型没有可用的字面形式。(与VB相比,VB允许DateTime
字面量,并且也有一个别名。)
只有一种情况必须使用别名:显式指定枚举的基础类型。例如:
public enum Foo : UInt32 {} // Invalid
public enum Bar : uint {} // Valid
这只是规范定义枚举声明的方式-冒号后面必须是整数类型,它是、、、、、、、、等一种integral-type标记,而不是变量声明等使用的type标记。这并不表示其他任何区别。
最后,在选择使用哪个方面上:我个人在实现时都使用别名,但是在任何API中都使用CLR类型。就实现而言使用哪个并不太重要-团队内部的一致性很好,但是其他人并不会关心。另一方面,在API中引用类型时以语言中立的方式呈现真的很重要。方法名为ReadInt32
是明确无误的,而方法名为ReadInt
则需要解释。调用者可能会使用将int
别名定义为Int16
的语言。.NET框架设计人员遵循了这种模式,在BitConverter
、BinaryReader
和Convert
类中有很好的例子。
String
代表的是 .NET Framework 中的 System.String
类型。在 C# 语言中,string
是对 System.String
的别名。它们都编译成了System.String
在 IL(Intermediate Language)中,所以没有区别。选择你喜欢的并使用它。如果你使用C#编码,我建议使用string
,因为它是C#类型的别名,并且被C#程序员广泛认可。
对于其他类型,如(int
, System.Int32
)等,我也可以这样说。
int
在C#语言规范中被定义为32位整数,而不考虑硬件。尽管C#与C语言有着共同的历史渊源,但实际上它们并不相同。将int
更改为64位整数将会打破规范和语言。这还需要重新定义long
,因为long
目前是64位整数。另一个没有必要担心的原因是,尽管类型永远不会改变,但.NET足够抽象,以至于99%的时间你根本不需要考虑它。;-) - Craig TullisInt16
,Int32
和 Int64
要比使用不太具描述性的 short
,int
和 long
更加清晰易懂。 - NyergudsIntXX
,而在其他情况下,我会使用short int long等等。我很感激自己可以任选一种,并会充分利用这种灵活性来最好地满足我的需求。对于我也不理解的这个论点,因为据我所知C/C++根本没有使用intXX别名,而C#则自行引入了它们。虽然如此,这是一个很棒的低级别讨论! - Narish在C#中使用提供的类型别名的最佳答案来自Jeffrey Richter在他的书CLR Via C#中。以下是他的3个原因:
- 我见过许多开发人员感到困惑,不知道在他们的代码中是否应该使用string还是String。因为在C#中,字符串(一个关键字)恰好映射到System.String(一个FCL类型),所以没有区别,两者都可以使用。
- 在C#中,long映射到System.Int64,但在另一种编程语言中,long可能映射到Int16或Int32。事实上,C++/CLI将long视为Int32。如果某个人习惯于使用不同的编程语言,那么阅读源代码时可能会错误地解释代码的意图。事实上,大多数语言甚至不将long视为关键字,并且不会编译使用它的代码。
- FCL有许多方法,它们的方法名称中包含类型名称。例如,BinaryReader类型提供了像ReadBoolean、ReadInt32、ReadSingle等方法,而System.Convert类型则提供了像ToBoolean、ToInt32、ToSingle等方法。尽管编写以下代码是合法的,但是第二行使用float感觉非常不自然,而且不明显该行是否正确:
BinaryReader br = new BinaryReader(...);
float val = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good
所以这就是全部内容。我认为这些都是非常好的观点。但是,就我个人而言,在我的代码中并没有使用杰弗里的建议。也许我太过于固执于我的C#世界,但我最终会尝试让我的代码看起来像框架代码。
string
是一个保留字,但String
只是一个类名。这意味着string
不能单独用作变量名。
如果出于某种原因你想要一个名为string的变量,你只能编译第一个选项:
StringBuilder String = new StringBuilder(); // compiles
StringBuilder string = new StringBuilder(); // doesn't compile
如果你真的想要一个名为string的变量名称,你可以使用@
作为前缀:
StringBuilder @string = new StringBuilder();
有一个区别 - 您不能在使用String
之前不使用using System;
。
更新:
大写字母"S"
的"String"
是指.NET Framework基类库中内置字符串数据类型的关键字。它是表示字符序列的引用类型。
另一方面,小写字母"s"
的"string"
是"System.String"
类型的别名,这意味着它们本质上是相同的。使用"string"只是一种简写方式来引用"System.String"
类型,并且在C#代码中更常用。
在C#中,"String"
和"string"
都可以互换使用,您可以使用任何一个来声明字符串类型的变量。
String myString = "Hello World"; // using the String keyword
string myString = "Hello World"; // using the string alias
然而,为了与语言的语法和约定保持一致,建议在C#代码中使用"string"
别名。
在这里,您可以阅读更多关于C#字符串的信息。
前面已经讲过了,但是在反射中你不能使用string
,必须使用String
。
typeof(string)
。例如:if (someMethodInfo.ReturnType == typeof(string)) { ... }
和 var p = typeof(string).GetProperty("FirstChar", BindingFlags.NonPublic | BindingFlags.Instance);
。那么,在哪里必须使用 String
而非 string
?如果你尝试像 Type.GetType("String")
或者 Type.GetType("string")
这样的操作,它们都无法找到类,因为命名空间缺失。如果由于某些“愚蠢”的原因你将类型的 .Name
与区分大小写的 "string"
进行比较,那么你是正确的。 - Jeppe Stig NielsenSystem.String
是.NET字符串类 - 在C#中,string
是System.String
的别名 - 因此在使用上它们是相同的。
至于指南,我不会太纠结,只需使用您喜欢的任何一个即可 - 生活中还有更重要的事情,并且代码将是相同的。
如果您发现自己正在构建需要指定所使用整数大小的系统,因此倾向于使用Int16
、Int32
、UInt16
、UInt32
等,则使用String
可能看起来更自然 - 并且在不同的.net语言之间移动时可能会使事情更容易理解 - 否则我会使用string和int。
出于格式化的原因,我更喜欢使用大写的 .NET
类型(而不是别名)。毕竟值类型是合适的对象,.NET
类型与其他对象类型相同颜色。
条件和控制关键字(例如 if
、switch
和 return
)是小写的,并且默认情况下为深蓝色。我宁愿不让使用和格式产生分歧。
考虑:
String someString;
string anotherString;
string
和 String
在所有方面都是相同的(除了大写的 "S")。没有性能上的影响.
在大多数项目中,小写的 string
更受欢迎,因为它可以进行语法高亮。
string
是 C# 语法的一个 词法 构造,而System.String
只是一种类型。无论任何规范中提到的 显式 差异如何,仍然存在这种隐含的差异,可能会带来一些歧义。语言本身必须以一种不需要考虑 BCL 中的特定类的方式支持string
。 - Kirk Wollstring
存在问题。需要缩写System.String
,但作为别名,它看起来非常相似,但不完全相同。然而,经过几年的C#编程,我认为,安全起见,可以直接使用string
和string.Format()
,不用担心System.String
。 - RolandSystem.String
类还在,而string
关键字仍然是它的别名,就像System.Int32
和int
一样。它们实际上是同一个东西。 - Craig Tullis