这两者之间有什么不同,我应该使用哪一个?
string s = "Hello world!";
String s = "Hello world!";
这个YouTube视频演示了它们之间的实际区别。
但是现在给出一个长篇回答。
当我们谈论.NET时,有两个不同的东西:一种是.NET框架,另一种是使用该框架的语言(如C#、VB.NET等)。
"System.String
"也称为"String"(大写"S")是.NET框架数据类型,而"string"是C#数据类型。
简而言之,“String”是“string”的别名(用不同的名称指代同一事物)。因此,下面两个代码语句在技术上将输出相同的结果。
String s = "I am String";
或者string s = "I am String";
同样地,其他 C# 数据类型也有别名,如下所示:
object: System.Object
, string: System.String
, bool: System.Boolean
, byte: System.Byte
, sbyte: System.SByte
, short: System.Int16
等等。
从程序员的角度看,现在是一个重要的问题:什么时候使用"String"和"string"?
首先要避免混淆,要一致地使用其中之一。但从最佳实践的角度来看,在变量声明时最好使用"string"(小写"s"),而在将其用作类名时,则应该使用"String"(大写"S")。
在下面的代码中,左侧是变量声明,使用了"string"。右侧我们正在调用一个方法,因此更合理的选择是"String"。
string s = String.ToUpper() ;
C# 是一种与 CLR 一起使用的编程语言。
string
是 C# 中的一种类型。
System.String
是 CLR 中的一种类型。
当你将 C# 与 CLR 一起使用时,string
将被映射为 System.String
。
理论上,你可以实现一个生成 Java 字节码的 C# 编译器。这个编译器的明智实现可能会将 string
映射为 java.lang.String
,以便与 Java 运行时库进行互操作。
小写的string
是System.String
的别名。在C#
中它们是相同的。
关于是否应该使用系统类型(System.Int32
, System.String
等)还是C#别名
(int
, string
等)有争议。我个人认为你应该使用C#别名
,但这只是我的个人偏好。
string
只是System.String
的别名。编译器会将它们视为相同。
唯一的实际区别就是语法高亮,正如您所提到的,并且如果使用String
,您必须编写using System
。
String
时,您必须包括using System
,否则会出现以下错误:The type or namespace name 'String' could not be found (are you missing a using directive or an assembly reference?)
。 - Ronald两者是相同的。但从编码指南的角度来看,最好使用 string
而不是 String
。这通常是开发人员使用的方式。例如,我们使用 int
代替 Int32
,因为 int
是 Int32
的别名。
“关键字 string 只是预定义类 System.String
的别名。”- C# Language Specification 4.2.3
http://msdn2.microsoft.com/En-US/library/aa691153.aspx
正如其他人所说,它们是相同的。默认情况下,StyleCop规则将强制您使用string
作为C#代码样式最佳实践,除非引用System.String
静态函数,例如String.Format
,String.Join
,String.Concat
等...
6年5个月之后有一个新的答案(拖延症)。
string
是C#中的保留关键字,它始终具有固定含义,但String
只是一个普通的标识符,可以指代任何东西。取决于当前类型的成员、当前命名空间和应用的using
指令及其位置,String
可能是与global::System.String
不同的值或类型。
我将提供两个示例,其中using
指令无法帮助解决问题。
首先,当String
是当前类型(或本地变量)的值时:
class MySequence<TElement>
{
public IEnumerable<TElement> String { get; set; }
void Example()
{
var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
}
}
上述代码无法编译,因为 IEnumerable<>
没有名为Format
的非静态成员,并且没有应用扩展方法。在上述情况下,可能仍然可以在其他语法上只能使用类型的情况下使用String
。例如:String local = "Hi mum!";
可以正常工作(取决于命名空间和using
指令)。String.Concat(someSequence)
,则可能会转到 Linq 扩展方法Enumerable.Concat
(取决于using
指令)。它不会进入静态方法string.Concat
。String
。class MyPiano
{
protected class String
{
}
void Example()
{
var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
String test2 = "Goodbye";
}
}
Example
方法中的两个语句都无法编译通过。这里的 String
总是一个钢琴弦,即 MyPiano.String
。它上面没有(静态或非静态)成员 Format
存在,也不会从其基类继承而来。而值 "Goodbye"
无法转换为它。
string
的变量,事情也无法编译。 - Paŭlo Ebermann@string
。它表示将string
视为普通标识符(而不是关键字)。不建议使用类似@string
的名称,但如果您需要访问在另一种.NET语言中编写的名称不是特殊的string
成员,则@
技巧变得有用。 - Jeppe Stig Nielsen使用系统类型可以更轻松地在 C# 和 VB.Net 之间移植,如果您对此感兴趣的话。
与其他程序员的常规做法相反,我更喜欢使用String
而非string
,这样可以突出显示String
是一种引用类型。这正如Jon Skeet所提到的那样。
string
是 System.String
的别名(或简称)。这意味着,通过输入 string
我们指的是 System.String
。您可以在此链接中了解更多信息:'string' is an alias/shorthand of System.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