这两者之间有什么区别,我应该使用哪一个?

string s = "Hello world!";
String s = "Hello world!";

当前回答

有一个区别 - 您不能使用 String 没有使用系统; 提前。

其他回答

字符串是保留的单词,但字符串只是一个类名称,这意味着字符串本身不能作为变量名称使用。

如果出于某种原因,你想要一个变量称为字符串,你只会看到这些编辑中的第一个:

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

如果你真的想要一个变量名称,称为字符串,你可以使用 @ 作为预定:

StringBuilder @string = new StringBuilder();

另一个关键差异:Stack Overflow以不同的方式突出它们。

字符串是 System.String 的缩短,唯一的区别是,你不需要提到 System.String 名称空间,所以比 String 更好地使用字符串。

StyleCop 规则,默认情况下,将允许您使用字符串作为一个 C# 代码风格的最佳实践,除非提到 System.String 静态功能,如 String.Format, String.Join, String.Concat 等。

虽然 String 是一个保留的 C# 关键词,总是有一个固定的含义, String 只是一个常见的识别器,可以提到任何东西. 根据当前类型的成员,当前的名称空间和应用的使用指令和他们的位置, String 可能是一个值或类型与全球::System.String 不同。

我将提供两个例子,其中使用指令不会有助于。


class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}

更糟糕的是: 說 String.Concat(someSequence) 將很可能(取決於使用) 去 Linq 擴展方法 Enumerable.Concat. 它不會去到静态方法 string.Concat。


其次,当 String 是另一种类型时,它在当前类型内定位:

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

这是一个协议问题,真的. 字符串只是看起来更像C/C++风格. 通用协议是使用你所选择的语言提供的任何缩写(int/Int为Int32)。 这也适用于“对象”和十数。

理论上,这可能有助于将代码转移到某些未来的64位标准,其中“int”可能意味着Int64,但这不是问题,我会期望任何升级巫师将改变任何int引用到Int32无论如何只是安全。