首页 文章

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

提问于
浏览
5633

示例(注意案例):

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

每个使用 guidelines 是什么?什么是 differences

30 回答

  • 82

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

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

    例如

    string place = "world";
    

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

    例如

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

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

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

  • 59

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

  • 35

    我想在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可以映射到Int16或Int32 . 事实上,C / CLI确实将long视为Int32 . 如果某人使用一种语言阅读源代码,如果他或她习惯于使用不同的编程语言进行编程,则很容易误解代码的意图 . 实际上,大多数语言甚至不会将long视为关键字,也不会编译使用它的代码 . FCL有许多方法,它们将类型名称作为其方法名称的一部分 . 例如,BinaryReader类型提供诸如ReadBoolean,ReadInt32,ReadSingle等方法,System.Convert类型提供诸如ToBoolean,ToInt32,ToSingle等方法 . 虽然编写下面的代码是合法的,但是浮点线对我来说感觉非常不自然,并且线条是正确的并不明显:BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); //好的,但感觉不自然
    Single val = br.ReadSingle(); //好的,感觉很好
    许多使用C#的程序员都倾向于忘记可以使用其他编程语言来对抗CLR,因此,C#-isms会进入类库代码 . 例如,Microsoft的FCL几乎全部用C#编写,FCL团队的开发人员现在已经在库中引入了方法,例如Array的GetLongLength,它返回一个在C#中很长的Int64值,但在其他语言中却没有(如C / CLI) ) . 另一个例子是System.Linq.Enumerable的LongCount方法 .

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

  • 438

    没有区别 .

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

    同样, int 映射到 System.Int32 .

  • 50

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

    但现在需要很长的文字答案 .

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

    enter image description here

    System.String " a.k.a " String " ( capital " S”)是 .NET 框架数据类型,而"string"是 C# 数据类型 .

    enter image description here

    简而言之,“String”是“string”的别名(使用不同的名称调用相同的东西) . 因此从技术上讲,下面的代码语句都会提供相同的输出 .

    String s = "I am String";
    

    要么

    string s = "I am String";
    

    同样,其他c#数据类型也有别名,如下所示: -

    对象: System.Object ,字符串: System.String ,bool: System.Boolean ,字节: System.Byte ,sbyte: System.SByte ,短: System.Int16 等等

    Now the million dollar question from programmer's point of view So when to use "String" and "string"?

    避免混淆的第一件事是始终如一地使用其中一个 . 但是从最佳实践的角度来看,当你做变量声明时,最好使用“string”(小“s”)并在你使用它时作为类名,则首选“String”(大写“S”) .

    在下面的代码中,左侧是变量声明,它使用“string”声明 . 在右侧,我们调用一种方法,因此“字符串”更明智 .

    string s = String.ToUpper() ;
    
  • 38

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

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

    BinaryReader br = new BinaryReader(...);
    float val  = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
    

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

  • 148

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

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

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

  • 174

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

    关于 (int, System.Int32) 等,我可以这么说 .

  • 137

    对于其他程序员似乎常见的做法,我更喜欢 String 而不是 string ,只是为了强调 String 是一个参考类型,正如Jon Skeet所提到的那样 .

  • 631

    6年零5个月后的新答案(拖延) .

    虽然 string 是一个始终具有固定含义的保留C#关键字,但 String 只是一个可以引用任何内容的普通标识符 . 根据当前类型的成员,当前命名空间和应用的 using 指令及其位置, String 可以是与 global::System.String 不同的值或类型 .

    我将提供两个例子,其中 using 指令无济于事 .


    首先,当 String 是当前类型(或局部变量)的 value 时:

    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!"; 可能没问题(取决于命名空间和 using 指令) .

    更糟糕的是:说 String.Concat(someSequence) 很可能(取决于 using )转到Linq扩展方法 Enumerable.Concat . 它不会转到静态方法 string.Concat .


    其次,当 String 是另一个 type 时,嵌套在当前类型中:

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

    Example 方法中的任何一个语句都没有编译 . 这里 String 总是钢琴stringMyPiano.String . 没有成员( static 或不) Format 在其上(或从其基类继承) . 并且值 "Goodbye" 无法转换为它 .

  • 122

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

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

  • 3142

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

    string 是C#中的类型 .

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

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

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

  • 280

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

  • 103

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

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

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

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

    StringBuilder @string = new StringBuilder();
    

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

  • 37

    两者都是一样的 . 但从编码指南的角度来看,最好使用 string 而不是 String . 这是开发人员通常使用的 . 例如而不是使用 Int32 我们使用 int ,因为 intInt32 的别名

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

  • 42

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

  • 342

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

  • 179

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

    正如其他人所说, 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 .

    在规范中,值类型别名称为"simple types" . 文字可用于每种简单类型的常量值;没有其他值类型具有可用的文字形式 . (与VB比较,允许 DateTime 文字,并且也有它的别名 . )

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

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

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

    最后,当谈到使用它时:我个人在各处使用别名来实现,但是任何API都使用CLR类型 . 如果你在API中引用一个类型,那么你真的很重要的是,你要以语言中立的方式这样做 . 名为 ReadInt32 的方法是明确的,而名为 ReadInt 的方法需要解释 . 例如,调用者可能正在使用为 Int16 定义 int 别名的语言 . .NET框架设计者遵循了这种模式,良好的例子在 BitConverterBinaryReaderConvert 类中 .

  • 54

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

  • 59

    Daniel Solis' book这个问题有一个引用 .

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

  • 398

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

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

    Example

    string String = "I am a string";
    

    除关键字问题外,关键字 stringSystem.String 的别名,两者完全等效 .

    typeof(string) == typeof(String) == typeof(System.String)
    
  • 77

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

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

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

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

    而且,现在,当我看到“int”或“string”时,我看起来真的错了,就像我在看1970年代的C代码一样 .

  • 160

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

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

  • 5335

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

  • 218

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

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

    考虑:

    String someString; 
    string anotherString;
    
  • 134

    它's been covered above; however, you can'在反射中使用 string ;你必须使用 String .

  • 32

    小写 stringSystem.String 的别名 . 它们在 C# 中是相同的 .

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

  • 73

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

  • 44

    There is one difference - 事先没有 using System; 你不能使用 String .

  • 65

    stringString 在所有方面都相同(大写"S"除外) . 无论如何都没有性能影响 .

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

相关问题