String 和 C#中的 string 有什么区别?

示例( 注意情况 ):

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);

这是 Microsoft 倾向于在示例中使用的样式。

似乎此区域中的指南可能已更改,因为StyleCop现在强制使用 C#特定别名。

为了完整起见,这里有一些相关信息的摘要……

正如其他人指出的那样, stringSystem.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

除了stringobject ,别名都是值类型。 decimal是一种值类型,但不是 CLR 中的原始类型。没有别名的唯一基本类型是System.IntPtr

在规范中,值类型别名称为 “简单类型”。文字可以用于每种简单类型的常量值;没有其他值类型具有文字形式可用。 (将此与 VB 进行比较,VB 允许使用DateTime文字,并且也具有别名。)

在一种情况下,您必须使用别名:当显式指定枚举的基础类型时。例如:

public enum Foo : UInt32 {} // Invalid
public enum Bar : uint   {} // Valid

这只是规范定义枚举声明的方式的问题 - 冒号后面的部分必须是整数类型的产生,这是sbytebyteshortushortintuintlongulongchar一个标记。 .. 与例如变量声明所使用的类型产生相反。它并不表示其他任何区别。

最后,涉及到使用什么:我个人将别名用于实现,但对于任何 API 均使用 CLR 类型。在实现方面,您使用哪一个并不重要,因为您的团队之间的一致性很好,但是没有人会在意。另一方面,真正重要的是,如果您在 API 中引用类型,则必须以与语言无关的方式进行。称为ReadInt32的方法是明确的,而称为ReadInt的方法ReadInt需要解释。例如,调用者可能使用的语言为Int16定义了int别名。 .NET 框架设计人员遵循了这种模式, BitConverterBinaryReaderConvert类中的例子很好。

String表示System.String ,它是. NET Framework 类型。 string C#语言中System.String 的别名 。它们都被编译为IL (中间语言)中的System.String ,因此没有区别。选择您喜欢的东西并使用它。如果您使用 C#编写代码,则我更喜欢string因为它是 C#类型的别名,并且为 C#程序员所熟知。

我可以对intSystem.Int32等说同样的话。

我听说过的关于在 C#中使用提供的类型别名的最佳答案来自 Jeffrey Richter 在他的书CLR Via C#中 。这是他的 3 个原因:

  • 我看到许多开发人员感到困惑,他们不知道在他们的代码中使用string还是String 。因为在 C#中,字符串(关键字)精确地映射到 System.String(FCL 类型),所以没有区别,并且两者都可以使用。
  • 在 C#中, long映射到System.Int64 ,但是在另一种编程语言中, long可以映射到Int16Int32 。实际上,C ++ / CLI 实际上确实像Int32一样对待。如果某人阅读一种语言的源代码,如果习惯于使用另一种编程语言进行编程,则很容易会误解该代码的意图。事实上,大多数语言甚至不会把只要关键字,将无法编译代码,使用它。
  • FCL 有很多方法,这些方法的名称中包含类型名称。例如, BinaryReader类型提供诸如ReadBooleanReadInt32ReadSingle等方法,而System.Convert类型提供诸如ToBooleanToInt32ToSingle等方法。尽管编写以下代码是合法的,但带 float 的行对我来说感觉很不自然,并且显然该行是正确的:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

所以你有它。我认为这些都是非常好的要点。但是,我发现自己没有在自己的代码中使用 Jeffrey 的建议。也许我在 C#世界中陷于困境,但最终还是试图使我的代码看起来像框架代码。

string是保留字,而String只是类名。这意味着string本身不能用作变量名。

如果由于某种原因您想要一个名为string的变量,那么您只会看到以下第一个编译:

StringBuilder String = new StringBuilder();  // compiles
StringBuilder string = new StringBuilder();  // doesn't compile

如果您确实想要一个名为string的变量名,则可以使用@作为前缀:

StringBuilder @string = new StringBuilder();

另一个重要的区别:堆栈溢出以不同的方式突出显示它们。

有一个区别 - 不using System;就不能使用String using System;预先。

上面已经讲过了;但是,不能在反射中使用string 。您必须使用String

System.String是. NET 字符串类 - C# stringSystem.String的别名 - 因此在使用中它们是相同的。

至于指导原则,我不会陷入困境,只要使用您喜欢的任何方式,生活中就会有更重要的事情,而且代码无论如何都将是相同的。

如果您发现自己需要指定所使用整数的大小的构建系统,因此倾向于使用Int16Int32UInt16UInt32等。那么使用String看起来更自然 - 并且在不同位置之间移动时. net 语言可能会使事情更容易理解 - 否则我将使用 string 和 int。

由于格式化的原因,我更喜欢使用大写的.NET类型(而不是别名)。 .NET类型的颜色与其他对象类型相同(毕竟,值类型是正确的对象)。

条件和控制关键字(例如ifswitchreturn )为小写字母,颜色为深蓝色(默认情况下)。我宁愿在使用和格式方面没有分歧。

考虑:

String someString; 
string anotherString;

stringString在所有方面都相同(大写字母 “S” 除外)。两种方式都不会影响性能。

在大多数项目中,由于语法突出显示,小写string是首选