C#中字符串和字符串有什么区别?

c# .net string types alias

1000102 观看

30回复

16826 作者的声誉

示例(注意案例):

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

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

作者: Lance Fisher 的来源 发布者: 2008 年 8 月 10 日

回应 30


5726

40614 作者的声誉

决定

string是C#中的别名System.String
从技术上讲,没有区别。这就像int 对战 System.Int32

就指南而言,通常建议string您在引用对象时使用。

例如

string place = "world";

同样,我认为String如果您需要专门参考该课程,通常建议使用它。

例如

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

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

看来这个领域的指导可能已经改变,因为StyleCop现在强制使用C#特定的别名。

作者: Derek Park 发布者: 2008 年 8 月 10 日

238

6411 作者的声誉

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

至于指导方针,我不会陷入困境,只是使用你想要的任何东西 - 生活中有更重要的事情,无论如何代码都是一样的。

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

作者: Ronnie 发布者: 2008 年 8 月 10 日

152

21511 作者的声誉

小写string是别名System.String。它们是相同的C#

有过是否应使用系统类型(辩论System.Int32System.String等)类型或C# aliasesintstring,等)。我个人认为你应该使用C# aliases,但这只是我个人的偏好。

作者: urini 发布者: 2008 年 8 月 10 日

477

1739 作者的声誉

我听说过在C#中使用提供的类型别名的最佳答案来自Jeffrey Richter在他的书“ CLR Via C#”中。以下是他的3个理由:

  • 我看到许多开发人员感到困惑,不知道是否在他们的代码中使用字符串字符串。因为在C#中,字符串(关键字)完全映射到System.String(一种FCL类型),所以没有区别,任何一种都可以使用。
  • 在C#中,映射到System.Int64,但是在不同的编程语言中,long可以映射到Int16Int32。事实上,C ++ / CLI确实将long视为Int32。如果某人使用一种语言阅读源代码,如果他或她习惯于使用不同的编程语言进行编程,则很容易误解代码的意图。事实上,大多数语言甚至不会将long视为关键字,也不会编译使用它的代码。
  • FCL有许多方法,它们将类型名称作为其方法名称的一部分。例如,BinaryReader类型提供诸如ReadBooleanReadInt32ReadSingle等方法,而System.Convert类型提供诸如ToBooleanToInt32ToSingle等方法。虽然编写下面的代码是合法的,但浮点线对我来说感觉非常不自然,并且线条不正确并不明显:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

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

作者: Luke Foust 发布者: 2008 年 8 月 15 日

61

1838 作者的声誉

真的,这是一个惯例问题。 string看起来更像是C / C ++风格。一般约定是使用您选择的语言提供的任何快捷方式(int / Int for Int32)。这也适用于“对象” decimal

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

作者: Mel 发布者: 2008 年 8 月 18 日

369

389 作者的声誉

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

作者: user3296 发布者: 2008 年 8 月 27 日

196

14635 作者的声誉

.NET出于格式化原因, 我更喜欢大写类型(而不是别名)。的.NET类型是彩色一样其他对象类型(该值的类型是正确的对象,毕竟)。

条件和控制关键字(如if,, switchreturn)是小写的,并且是深蓝色(默认情况下)。我宁愿在使用和格式方面没有分歧。

考虑:

String someString; 
string anotherString; 
作者: Anthony Mastrean 发布者: 2008 年 9 月 3 日

93

21421 作者的声誉

使用系统类型可以更容易地在C#和VB.Net之间进行移植,如果你是这样的话。

作者: Ishmael 发布者: 2008 年 9 月 22 日

184

26301 作者的声誉

string并且String在所有方面都是相同的(除了大写的“S”)。无论如何都没有性能影响。

string由于语法高亮,大多数项目都首选小写

作者: TheSoftwareJedi 发布者: 2008 年 10 月 18 日

148

11649 作者的声誉

string只是一个别名System.String。编译器会以相同的方式处理它们。

唯一的实际区别是你提到的语法高亮,using System如果你使用你必须写String

作者: Hallgrim 发布者: 2008 年 10 月 18 日

675

4208 作者的声誉

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

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

作者: artur02 发布者: 2008 年 10 月 18 日

133

9884 作者的声誉

两者都是一样的。但从编码指南的角度来看,最好使用string而不是String。这是开发人员通常使用的。例如,而不是使用Int32我们使用intas intasiasInt32

仅供参考“关键字字符串只是预定义类的别名System.String。” - C#语言规范4.2.3 http://msdn2.microsoft.com/En-US/library/aa691153.aspx

作者: Pradeep Kumar Mishra 发布者: 2008 年 10 月 18 日

3289

1125136 作者的声誉

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

正如其他人所说,string是别名System.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

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

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

在某种情况下,您必须使用别名:明确指定枚举的基础类型时。例如:

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

这只是一个的规范定义枚举声明的方式事情-冒号后的部分必须是整体式的生产,这是一个标志sbytebyteshortushortintuintlongulongchar...,而不是一个类型生产为例如,由变量声明使用。它并不表示任何其他差异。

最后,当涉及到使用哪个时:我个人在各处使用别名来实现,但是任何API都使用CLR类型。你在实施方面使用它并不重要 - 团队之间的一致性很好,但没有人会关心。另一方面,如果您在API中引用类型,则以语言中立的方式执行此操作,这一点非常重要。调用的方法ReadInt32是明确的,而调用的方法ReadInt需要解释。例如,调用者可能正在使用定义int别名的语言Int16。在.NET框架的设计者都遵循这种模式,在很好的例子是BitConverterBinaryReaderConvert类。

作者: Jon Skeet 发布者: 2008 年 10 月 18 日

297

7673 作者的声誉

它已被覆盖; 但是,你不能用于string反思; 你必须使用String

作者: TraumaPony 发布者: 2008 年 10 月 19 日

113

2241 作者的声誉

正如其他人所说,他们是一样的。了StyleCop规则,默认情况下,将强制你使用string的C#代码风格的最佳实践,引用时除外System.String静态函数,如String.FormatString.JoinString.Concat,等...

作者: Lloyd Cotten 发布者: 2008 年 10 月 19 日

433

78607 作者的声誉

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

如果由于某种原因你想要一个名为string的变量,你只能看到第一个这样的编译:

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

如果你真的想要一个名为string的变量名,你可以@用作前缀:

StringBuilder @string = new StringBuilder();

另一个重要区别:Stack Overflow以不同的方式强调它们。

作者: Simon_Weaver 发布者: 2009 年 2 月 24 日

174

39129 作者的声誉

C#是一种与CLR一起使用的语言。

string 是C#中的一个类型。

System.String 是CLR中的一种类型。

当您将C#与CLR一起使用时,string将映射到System.String

从理论上讲,您可以实现生成Java字节码的C#编译器。这个编译器的合理实现可能会映射stringjava.lang.String以便与Java运行时库进行互操作。

作者: Rasmus Faber 发布者: 2009 年 3 月 17 日

71

61 作者的声誉

我想将此添加到来自Ritchers书中的lfousts答案中:

C#语言规范指出,“作为一种风格问题,使用关键字比使用完整的系统类型名称更受青睐。”我不同意语言规范; 我更喜欢使用FCL类型名称并完全避免基本类型名称。实际上,我希望编译器甚至不提供原始类型名称,并强迫开发人员使用FCL类型名称。这是我的理由:

  • 我看到许多开发人员感到困惑,不知道是否在他们的代码中使用字符串字符串。因为在C#string(一个关键字)中精确映射到 System.String(一种FCL类型),所以没有区别,任何一种都可以使用。类似地,我听说有些开发人员说当应用程序在32位操作系统上运行时,int表示32位整数,当应用程序在64位操作系统上运行时,它表示64位整数。这句话绝对是错误的:在C#中,int总是映射到System.Int32,因此它表示一个32位整数,而不管代码运行的操作系统如何。如果程序员会使用Int32在他们的代码中,那么这种潜在的混乱也被消除了。

  • 在C#中,映射到System.Int64,但是在不同的编程语言中,long 可以映射到Int16Int32。实际上,C ++ / CLI确实将long视为Int32。如果某人使用一种语言阅读源代码,如果他或她习惯于使用不同的编程语言进行编程,则很容易误解代码的意图。事实上,大多数语言甚至不会将long视为关键字,也不会编译使用它的代码。

  • FCL有许多方法,它们将类型名称作为其方法名称的一部分。例如,BinaryReader类型提供诸如ReadBooleanReadInt32ReadSingle等方法,而System.Convert类型提供诸如 ToBooleanToInt32ToSingle等方法。虽然编写下面的代码是合法的,但浮点线对我来说感觉非常不自然,并且线条不正确并不明显:

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
    
  • 许多使用C#的程序员都倾向于忘记可以使用其他编程语言来对抗CLR,因此,C#-isms会进入类库代码。例如,Microsoft的FCL几乎全部用C#编写,FCL团队的开发人员现在已经在库中引入了一些方法,例如 ArrayGetLongLength,它返回一个在C#中很长Int64值,但在其他语言中却没有(比如C ++) / CLI)。另一个例子是System.Linq.EnumerableLongCount方法。

在我阅读完整段落之前,我没有得到他的意见。

作者: claudioalpereira 发布者: 2011 年 1 月 28 日

65

91 作者的声誉

String不是关键字,它可以用作标识符,string而是关键字,不能用作标识符。并且在功能上看两者都是一样的。

作者: user576533 发布者: 2011 年 4 月 25 日

84

415 作者的声誉

反对什么似乎其他程序员是常有的事,我更喜欢Stringstring,只是为了强调一个事实,即String是引用类型,如乔恩斯基特提及。

作者: RolandK 发布者: 2011 年 5 月 31 日

33

3027 作者的声誉

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

作者: Dot NET 发布者: 2011 年 8 月 24 日

79

2144 作者的声誉

string是别名(或简写)System.String。这意味着,通过键入string我们的意思System.String。您可以在思考链接中阅读更多内容:'string'是System.String的别名/简写。

作者: JeeShen Lee 发布者: 2011 年 10 月 21 日

48

422478 作者的声誉

没有区别。

C#关键字string映射到.NET类型System.String- 它是一个保持语言命名约定的别名。

同样,int映射到System.Int32

作者: Oded 发布者: 2012 年 1 月 14 日

71

8054 作者的声誉

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

作者: Joe Alfano 发布者: 2012 年 1 月 14 日

65

2553 作者的声誉

聚会迟到:我100%使用CLR类型(好吧,除非被迫使用C#类型,但我不记得最后一次是什么时候)。

根据Ritchie的CLR书籍,我最初几年前开始做这件事。我认为所有CLR语言最终都必须能够支持CLR类型集,因此使用CLR类型本身提供了更清晰,可能更“可重用”的代码。

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

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

而且,现在,当我看到“int”或“string”时,我看起来真的很不对劲,就像我在看1970年代的C代码一样。

作者: Michael Ray Lovett 发布者: 2012 年 8 月 24 日

39

715 作者的声誉

是的,他们之间没有区别,就像boolBoolean

作者: Coder 发布者: 2012 年 10 月 8 日

43

4139 作者的声誉

Daniel Solis的书中引用了这个问题。

所有预定义类型都直接映射到底层.NET类型。C#类型名称(字符串)只是.NET类型(String或System.String)的别名,因此使用.NET名称在语法上可以很好地工作,尽管不鼓励这样做。在C#程序中,您应该使用C#名称而不是.NET名称。

作者: user2771704 发布者: 2013 年 11 月 1 日

161

18026 作者的声誉

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

但现在需要长篇文章答案。

当我们谈论.NET有两个不同的东西一个有.NET框架和其他有语言(C#VB.NET等等),它使用的框架。

在此输入图像描述

System.String”aka“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 s = String.ToUpper() ;
作者: Shivprasad Koirala 发布者: 2014 年 1 月 15 日

40

10200 作者的声誉

string是关键字,您不能使用string作为标识符。

String不是关键字,您可以将其用作标识符:

string String = "I am a string";

除关键字问题外,关键字string 是别名 System.String,两者完全等效。

 typeof(string) == typeof(String) == typeof(System.String)
作者: Neel 发布者: 2014 年 6 月 11 日

95

45115 作者的声誉

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!";可以是OK(取决于命名空间和using指令)。

更糟糕的是:说String.Concat(someSequence)可能(取决于usings)转到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";
  }
}

Example方法中的任何一个语句都不会编译。这String始终是一个钢琴MyPiano.String。不存在任何成员(static或不Format存在)(或从其基类继承)。而且价值"Goodbye"无法转化为它。

作者: Jeppe Stig Nielsen 发布者: 2015 年 1 月 15 日
32x32