CSharp - String和string之间的区别是什么?

  显示原文与译文双语对照的内容
0 0

在 C# 中,StringString 之间的区别是什么? ( 注意案例):


string s ="Hello, World";

String S ="Hello, World";

使用每种方法的准则是什么? 还有什么区别?

时间: 原作者:

0 0

stringSystem.String的别名。 所以从技术上讲,没有区别。 它就像 int vs 。System.Int32

就指南而言,我认为在你引用对象时,通常建议使用 string

: )


string place ="world";

类似地,我认为如果你需要专门引用类,则建议使用 string

: )


string greet = String.Format("Hello {0}!", place);

这是微软在中使用的样式,他们的例子


似乎这里区域中的指南已经更改,因为 StyleCop 现在强制使用C#-specific别名。

原作者:
0 0

为了完整,这里是一个相关信息的大脑转储。

就像其他人所注意到的,stringSystem.String的别名。 它们编译到相同的代码,所以在执行时没有任何区别。 这只是 C# 中的一个别名。 完整的List 是:


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

在规范中,值类型别名称为"简单类型"。 文本可以用于每个简单类型的常量值;没有其他值类型具有可用的文本形式。 ( 与 DateTime 进行比较,它允许文本,并且也有一个别名。)

有一个情况下你使用别名: 显式指定枚举类型的基础时。 举个例子:


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

最后,当谈到要使用的时候: 我个人为实现使用别名,但对于任何api都使用CLR类型。 在实现方面,你使用的内容并不重要- 你的团队中的一致性很好,但是其他人不会关心。 另一方面,如果你引用一个API中的类型,那么你就可以用中性的方式来实现。 名为 ReadInt32的方法是不明确的,而调用 ReadInt的方法需要解释。 调用者可以使用一种语言,它定义了一个 intInt16 别名,例如。 .NET 框架设计者已经遵循了这个模式,在 BitConverterBinaryReaderConvert 类中都有很好的示例。

原作者:
0 0

String 代表 System.String,它是一个. NET 框架类型。 String 是别名System.String C# 语言。 他们都是编译为 System.String 在il ( 中间语言), 所以没有区别。 选择你喜欢的并使用它。 如果你在 C# 中代码,我宁愿 String,因为它是 C# 类型别名,由 C# 程序员熟知。

我可以说相同的( intSystem.Int32 ) 等等 。

原作者:
0 0

我听说过在 C# 中使用提供的类型别名的最好的答案是 Jeffrey 。Richter在他的图书 CLR中通过 C# 。 以下是他的3个原因:

  • 我看过许多开发人员感到困惑,不知道是否使用字符串字符串代码。 因为在 C# 中字符串( 关键字) 映射到 System.String ( FCL类型),没有区别,也可以使用。
  • 在 C# 地图 System.Int64, 但在不同的编程语言,可以映射到一个 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# 世界中太落后了,但是我最终试图让我的代码看起来像框架代码。

原作者:
0 0

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

如果出于某种原因,你需要一个名为字符串的变量,那么你只能看到其中的第一个编译:


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

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


StringBuilder @string = new StringBuilder();

另一个关键差异:Stackoverflow以不同的方式突出显示它们。

原作者:
0 0

上面已经介绍过了;但是,你不能在反射中使用 string ;你必须使用 string

原作者:
0 0

盘腿坐在onedifference:你可以使用 Stringusing System; 无beforehand非。

原作者:
0 0

Valters,你无法以 stringint,等等的样式建立全局别名。 但是,你可以使用 using 关键字为类型和命名空间做更多的本地化别名。

: )


using str = System.String;
//...
str s ="Now you've got another alias for string!";

查看这里:使用指令( C# 引用)

原作者:
0 0

stringstring 在所有方面都是相同的( 除了大写字母"") 。 没有任何性能影响。

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

原作者:
0 0

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

至于指南我不会太纠缠,就用哪个你觉得——生活中有更重要的事情和代码将是相同的。

如果你自己构建系统,需要指定所使用整数的大小,那么倾向于使用 Int16Int32UInt16UInt32 等等,那么在不同的.NET 语言中可能会更容易理解。

原作者:
...