[C#] String和C#中的字符串有什么区别?


Answers

为了完整起见,这里是相关信息的大脑转储...

正如其他人所指出的, 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。 在实现方面你使用的确不重要 - 团队之间的一致性很好,但没有其他人会关心。 另一方面,如果你在一个API中引用一个类型,这是非常重要的,你以一种语言中立的方式来实现。 称为ReadInt32的方法是明确的,而称为ReadInt的方法需要解释。 例如,调用者可以使用为Int16定义int别名的语言。 .NET框架设计师遵循这种模式,在BitConverterBinaryReaderConvert类中有很好的例子。

Question

示例( 注意案例 ):

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

什么是使用每个指导原则 ? 有什么区别




此YouTube视频实际上展示了它们的不同之处。

但是现在需要长时间的文字回答。

当我们谈论.NET ,有两种不同的东西,一种是.NET框架,另一种是使用该框架的语言( C#VB.NET等)。

System.String ”aka“String”(大写“S”)是一个.NET框架数据类型,而“string”是一个C#数据类型。

简而言之,“字符串”是“字符串”的别名(称为不同名称的同一事物)。 所以在技术上,下面的代码语句会给出相同的输出。

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”(小的“s”),当你将它用作类名时,首选“String”(大写“S”)。

在下面的代码中,左边是一个变量声明,并用“string”声明。 在右侧,我们正在调用一个方法,所以“字符串”更明智。

string s = String.ToUpper() ;



两者之间没有区别 - string但是,在考虑其他开发人员的源代码时,似乎是首选。




New answer after 6 years and 5 months (procrastination).

While string is a reserved C# keyword that always has a fixed meaning, String is just an ordinary identifier which could refer to anything. Depending on members of the current type, the current namespace and the applied using directives and their placement, String could be a value or a type distinct from global::System.String .

I shall provide two examples where using directives will not help .

First, when String is a value of the current type (or a local variable):

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

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

The above will not compile because IEnumerable<> does not have a non-static member called Format , and no extension methods apply. In the above case, it may still be possible to use String in other contexts where a type is the only possibility syntactically. For example String local = "Hi mum!"; could be OK (depending on namespace and using directives).

Worse: Saying String.Concat(someSequence) will likely (depending on using s) go to the Linq extension method Enumerable.Concat . It will not go to the static method string.Concat .

Secondly, when String is another type , nested inside the current type:

class MyPiano
{
  protected class String
  {
  }

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

Neither statement in the Example method compiles. Here String is always a piano string , MyPiano.String . No member ( static or not) Format exists on it (or is inherited from its base class). And the value "Goodbye" cannot be converted into it.




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

至于指导方针,我不会陷入困境,只是用你自己喜欢的方式 - 生活中有更重要的事情,代码也会一样。

如果你发现自己构建的系统需要指定你正在使用的整数的大小,并且倾向于使用Int16Int32UInt16UInt32等,那么使用String可能更自然 - 并且当在不同的.net语言可能会让事情变得更容易理解 - 否则我会使用string和int。




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




String( System.String )是基类库中的一个类。 字符串(小写)是C#中保留的工作,它是System.String的别名。 Int32与int类似, Boolean vs. bool 。 这些C#语言特定的关键字使您能够以类似于C的风格声明原语。




小写stringSystem.String的别名。 它们在C#中是一样的。

关于是否应该使用System类型( System.Int32System.String等)类型或C# aliasesintstring等)存在争议。 我个人认为你应该使用C# aliases ,但这只是我个人的偏好。




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

  • 我看到许多开发人员感到困惑,不知道是否要在他们的代码中使用字符串字符串 。 因为在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

所以你有它。 我认为这些都是非常好的一点。 然而,我并没有发现自己在自己的代码中使用杰弗里的建议。 也许我太困在我的C#世界,但我最终试图让我的代码看起来像框架代码。




这是一个惯例,真的。 “string”看起来更像C / C ++风格。 一般惯例是使用你选择的语言提供的任何快捷键(int / Int for Int32)。 这也适用于“对象”和“小数”。

从理论上讲,这可能有助于将代码移植到未来的64位标准中,其中“int”可能意味着Int64,但这不是重点,我希望任何升级向导都可以将任何“int”引用更改为“Int32”注意安全。




正如其他人所说的,他们是一样的。 StyleCop规则默认情况下会强制您使用string作为C#代码样式的最佳实践,除非引用System.String静态函数(例如String.FormatString.JoinString.Concat等)。




晚会迟到:我在100%的时间里使用CLR类型(当然,除非被迫使用C#类型,但我不记得最后一次是什么时候)。

根据里奇的CLR书籍,我最初是在几年前开始做的。 对我而言,所有CLR语言最终都必须能够支持CLR类型集合,因此使用CLR类型可以提供更清晰,更可重用的代码。

现在我已经做了好几年了,这是一种习惯,我喜欢VS为CLR类型显示的着色。

唯一真正的地方是自动完成使用C#类型,所以我最终重新输入自动生成的类型来指定CLR类型。

此外,现在,当我看到“int”或“string”时,它看起来真的错了,就像我正在查看1970年代的C代码一样。




Yes, that's no difference between them, just like the bool and Boolean .




stringString在所有方面都是相同的(大写字母“S”除外)。 这两种方式都没有任何性能影响。

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




与其他程序员看似普遍的做法相反,我更喜欢String over string ,只是为了突出显示String是参考类型的事实,正如Jon Skeet所述。




Links