例子(注意案例):
1 2
| string s ="Hello world!";
String s ="Hello world!"; |
每种方法的使用指南是什么?有什么不同呢?
- @O.R。但是事实仍然是string是c#语法的词法构造,而System.String只是一种类型。无论在任何规范中提到任何显式差异,仍然存在这种隐式差异,这种差异可以通过一些模糊性进行调整。语言本身必须支持string,而实现没有(相当)义务考虑BCL中的特定类。
- @KirkWoll:根据语言规范,该语言本身必须认为string与BCL类型System.String完全相同,没有其他内容。这一点也不含糊。当然,您可以使用c#语法实现您自己的编译器,并将找到的所有这样的标记用于一些任意的东西,与c#语言规范中定义的内容无关。但是,生成的语言只能是一个类似于c#的语言,不能认为它是c#。
- 您可以使用string而不需要一个using指令for System。你不能用String这样做。
- 顺便说一下,阅读关于拳击/开箱。装箱和拆箱的概念是类型系统c#统一视图的基础,在这个视图中,任何类型的值都可以作为对象来处理。
- 字符串是c#中的别名。而字符串属于系统。两者没有这样的区别。
- 对于来自Algol和Fortran的人来说,这个讨论表明string有问题。它需要缩写为System.String,但是作为别名,它看起来很像,但并不完全相同。不过,在使用了c#几年之后,我想说,只使用string和string.Format()是安全的,而不用担心System.String。
- 技术上没有区别
- 自2014年以来,.net框架中的约定发生了很大的变化。现在在声明变量时不存在字符串(大写s)。只有别名字符串(小s)可用。微软可能想要消除令人困惑的编程方法!
- @Sangeeta你在说什么?System.String类仍然存在,string关键字仍然是它的别名。就像System.Int32和int一样。它们实际上是一样的。
- 当您使用string时,编译器会用System.String的引用替换它。它们是相同的东西,实际上是相同的实现。
string是c#中System.String的别名。所以从技术上讲,没有区别。就像int对System.Int32。
至于指南,通常建议在引用对象时使用string。
如。
同样,如果您需要特别引用该类,我认为一般建议使用String。
如。
1
| string greet = String.Format("Hello {0}!", place); |
这是微软在他们的示例中倾向于使用的样式
这方面的指导可能已经改变,因为StyleCop现在强制使用c#特定的别名。
- @JonSkeet -和你一样,我更喜欢别名类型。开发类库的设计指南——一般命名约定建议开发人员坚持特定于语言的命名,而不是CLR类型。它们在Convert方法中这样做,以保存它们为每种语言重新定义它。
- 不过这是在成员名中,而不是在实现中。我对公共int ReadInt32()没有问题。
- 如果您决定使用StyleCop并遵循它,那就是说使用特定于该语言的类型。对于c#,你会有string(而不是string), int(而不是Int32), float(而不是Single) - stylecop.soyuz5.com/SA1121.html
- 我总是使用别名,因为我假设有一天它可能会派上用场,因为它们作为一个抽象,因此可以在不需要我知道的情况下更改它们的实现。
- 第二个例子不是" ' string greet = string。格式("你好{0}!";"意思是大写的S?"字符串?
- 弦的主要优点之一。我在实际源代码中看到的格式是这样使用的,String。格式("a值为{0}",a);a是声明和初始化的任何变量。这种格式化字符串的方法有很多优点。一个非常简单的例子是变量a是货币的值,我们可以用£或$或格式化为字符串的任何货币符号。
- Visual Studio 2015说的就是这个字符串。格式应该改为字符串。格式,我想微软也会这么做。对于静态方法,我也总是使用String。
- 为了添加到对话中,我注意到,如果使用String和not String声明对象,调用Equals("text")或StartsWith("text")等方法将不起作用,并且总是返回false。
- 当我读到这些的时候,我注意到一些评论是不正确的。随着时间的推移,你会发现旧的方法仍然是最好的,如果你怀疑这一点,那么我鼓励你尝试不使用Visual Studio来编写c#代码。这实际上是不可能的,而且在web开发工作中经常会出现这种情况。@Vlad不需要导入任何东西来使用String。@Abhi,你的评论毫无意义,对string.Format()同样正确。@KlitosG不,那不是真的。它们的工作原理完全一样。
- 我不喜欢别名。类名使用起来很有逻辑性(例如String.Format()),通常更具描述性(例如Int32 vs . int),并且可以立即确定它在框架(系统内)中的位置。但是看起来MS想让我们使用别名,所以这就是我们要做的。
- 注意:一些c#到vb.net转换器将字符串(c#)转换为[String](vb),将字符串(c#)转换为字符串(vb)。
- 我更喜欢小写,因为语法颜色与类不同,而且它给我一种使用内置语言特性而不是实现的感觉。
- 我总是使用字符串别名,特别是在可以避免使用"using System"语句的情况下。# lovesNegativeLinesOfCode
- 你能补充一句吗?事实上,这是有区别的。例如:nameof(string)不会编译,而nameof(String)会编译。
- java需要这些别名,当我使用"string"而不是"string"时,它会生气。c#不关心。
- 很抱歉问了这么愚蠢的问题,但你知道我们为什么需要这样的别名吗?
- Visual Studio 2015建议使用string.Format
- @krowe2在c#中,在类中引用String之前,必须包含一个using System;指令。也许您正在考虑VB,它似乎不需要一个等价的Imports指令。
- 不是严格意义上的别名,因为string是一个全局结构,而不是一个类,它恰好是System.String类型的包装器。
- 应该到处使用string而不是String
- 所以这里的每个人都建议这么做?new string('-', 100)啊!当访问静态成员(如Int32.Parse)或调用构造函数时,我更喜欢使用BCL名称。在指定类型时使用别名。
- @MikaelPuusaari:"如果您引用Int16而不是int,那么您将从默认的Int32指定类型。"-你想说什么并不清楚(实际上,在完整的段落中)。您能否尝试重新表述和/或提供一个具体的例子来说明您的意思(它说明了int与Int32与string与String之间的区别)?
- 我过去喜欢语法String.Format(),但是最新版本的Visual Studio实际上将其标记为一个可以简化的表达式。当你化简它,它就变成string.Format()。因此,就Visual Studio而言,在使用c#时,string始终是首选语法。
- @SparK No, string不是结构体;它总是引用类System.String。它们在IL中是100%相同的。
- 此外,对于泛型的类型参数,MSDN示例更喜欢List而不是List
- 关键的区别是string保证总是引用System.String,而String可以引用不同名称空间中具有相同名称的不同类
- @userSteve我去年8月刚刚遇到这个问题,花了一段时间才发现它是错误的名称空间。
- 我不明白你的意思。如果string以改变程序行为的方式改变了它的实现,您不想知道吗?但是,如果您的程序(以及其他所有人的)更改不会改变行为,那么为什么不更改String的实现而不是string呢?只有当你是那个控制它的人,例如,如果你定义RobString现在指向String,或者在以后的某个时间点指向你喜欢的其他东西,你的附加的删除层才会有用。(我并不一定推荐这样做。)
- 这是一个有趣的例子,而且是真的。同样,如果有人用一个名为String的类在更紧的范围内隐藏了通用基类库System.String类型,那么应该对它们进行键控。:-)
- 这个答案是"一般建议",但没有解释该建议的任何理由,也没有说明什么时候"一般"建议可能不适用。
为了完整起见,这里有一个大脑转储的相关信息…
正如其他人所指出的,string是System.String的别名。它们编译成相同的代码,因此在执行时没有任何区别。这只是c#中的别名之一。完整名单如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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。
在规范中,值类型别名称为"简单类型"。文字可以用于任何简单类型的常量值;没有其他值类型具有可用的文字形式。(与VB相比,VB允许DateTime文字,并且也有别名。)
有一种情况必须使用别名:当显式地指定枚举的基础类型时。例如:
1 2
| public enum Foo : UInt32 {} // Invalid
public enum Bar : uint {} // Valid |
这只是规范定义enum声明的方式问题——冒号后面的部分必须是整型产品,它是sbyte、byte、short、ushort、int、uint、long、ulong、char的一个标记……例如,与变量声明中使用的类型生成相反。它没有显示任何其他的区别。
最后,当涉及到使用哪个时:就我个人而言,我在实现中到处都使用别名,但是对于任何api都使用CLR类型。在实现方面使用什么并不重要——团队之间的一致性很好,但是没有人会在意。另一方面,如果您在API中引用类型,那么以一种语言中立的方式引用类型是非常重要的。一个名为ReadInt32的方法是明确的,而一个名为ReadInt的方法需要解释。例如,调用者可以使用为Int16定义int别名的语言。. net框架设计人员遵循了这种模式,BitConverter、BinaryReader和Convert类中有很好的例子。
- enum的继承情况很有趣。您能指出为什么必须使用别名进行枚举吗?或者这是一个已知的bug?
- 它在规范的14.1节中(我不能在这里轻易引用,因为它太长了)。它没有明确说明必须使用别名,但别名在某种程度上被视为它们自己的类型。这一切都有点奇怪。
- "所有别名都是针对值类型的"这句话在不同的别名集上重复了两遍。不可能同时为真)
- @PiPeep比大量的赞成票更令人震惊的是惊人的低反对票(考虑到前5个帖子总共有超过2000张赞成票,但在所有这些帖子中只有1张反对票)。尤其是当你考虑到在任何社区中总是有"仇恨者"这个概念时,我真的觉得这简直不可思议。
- +1感谢您提到enum的情况。我认为这才是真正的答案。c#中的枚举不像c++中的那样被认为是整数(int)值。因此,您应该在声明中对它进行类型转换或转换,就像@JonSkeet提到的那样。如果您这样做,那么它必须被认为是一种"类型"。关键字是单独考虑的,在我们的例子中,是一组原始类的别名。
- 您的评论:"它没有明确说明您必须使用别名,但是别名在某种程度上被视为它们自己的类型。这一切都有点奇怪。"
- @phoog:啊,对不起,我不知道你指的是评论。是的,规定得很清楚,我同意。
- @pinusnegra:不,不是这样的,至少和其他人不一样。例如,不能将方法声明为返回System.Void。你不能像那样在c#中直接使用System.Void。
- @JonSkeet啊,对)我没有检查,只是好奇,因为我认为这是一个关键字。那么system。void是什么意思呢?
- @JonSkeet"decimal是一种值类型,但不是CLR中的原始类型"你能解释一下这个想法吗?
- @HusseinX:当然——看看CLI规范,你会发现没有处理decimal的说明。就CLR而言,它只是"另一种值类型"。
- string和String之间一个有趣的区别是string' is a keyword in c#, so you can not use it as a variable name.For Ex: string ="hi";//compiler error, but string="hi"; '是可以接受的,因为String是identifire而不是关键字。
- @SanjeevRai:是的。您可以使用@string创建一个标识符,该标识符最终是string。这是一种逃逸机制。
- @PeterPorfy System.Void用于检查没有返回值的方法时的反射,例如在MethodInfo.ReturnParameter中。
- @NielsKeurentjes,通过学习f#的单元类型,我更接近了void的概念。反思也是有意义的,谢谢!
- 当您对string或string执行f12操作时,它会转到相同的string类元数据文件。
- 谢谢你@JonSkeet的精彩解释!比较轻松的一点是,几年前我有一个同事更喜欢使用System。因为他喜欢visual studio给它的水蓝色,而不是‘String’的深蓝色!
- 好的,但是是什么让人们写String而不是string呢?许多带有String的开放源代码。嗯。
- @ adam他们应该使用ReSharper,这将使花哨的aqua淡出一点,因为它说用字符串代替字符串;)
- @JonSkeet看起来enum必须使用别名的要求在c# 6中或者在它之前的某个时候已经被取消了(相关问题)。
- uint不是一个包装结构(像enum,围绕一个类)和UInt32不是一个包装类(围绕一个基元)吗?
- 不,一点也不。枚举也不是类的包装器。uint只是UInt32的别名。它们是完全相同的类型,都是struct(不是类)。
String代表System.String,它是. net框架类型。string是c#语言中用于System.String的别名。它们都是用IL(中间语言)编译成System.String的,所以没有区别。选择你喜欢的,然后使用它。如果您使用c#编写代码,我更喜欢string,因为它是一个c#类型别名,c#程序员都知道它。
对于(int、System.Int32等)我也可以说同样的话。
- 如果你用c#编写代码,我更喜欢string,因为它是c#类型的别名,而且c#程序员都知道它。一般来说,我认为这是最好的答案,但我提到的这一点似乎有点奇怪。
- 我个人更喜欢使用"Int32",因为它会立即显示值的范围。想象一下,如果他们在以后的更高位系统上升级"int"类型。c中的"int"显然被视为"目标处理器处理效率最高的整数类型",并被定义为"至少16位"。我更喜欢可预测的一致性,非常感谢。
- @MyDaftQuestions我同意。如果有的话,坚持使用。net类型是有意义的,因为它们对语言一无所知,而且类型很明显,独立于任何语言(我知道f#或VB的所有特性吗?)
- @Nyerguds有两个理由不去担心它。一个是无论硬件如何,int在c#语言规范中定义为32位整数。尽管c#在时间上是一个共享的传统,但它实际上并不是C。将int更改为64位整数将是规范和语言中的一个突破性的更改。它还需要重新定义long,因为long目前是64位整数。另一个不用担心的原因是无关紧要的,因为类型永远不会改变,但是. net非常抽象,99%的情况下您都不需要考虑它。:-)
- @Craig我深入研究了许多古老的专有游戏格式,在这些格式中我必须时刻思考这些问题。然后使用Int16、Int32和Int64比使用非描述性的short、int和long在代码中更加透明
关于在c#中使用所提供的类型别名,我所听到的最佳答案来自Jeffrey Richter在他的书CLR Via c#中。以下是他的三个理由:
I've seen a number of developers confused, not knowing whether to use string or String in their code. Because in C# the string (a keyword) maps exactly to System.String (an FCL type), there is no difference and either can be used.
In C#, long maps to System.Int64, but in a different programming language, long could map to an Int16 or Int32. In fact, C++/CLI does in fact treat long as an Int32. Someone reading source code in one language could easily misinterpret the code's intention if he or she were used to programming in a different programming language. In fact, most languages won't even treat long as a keyword and won't compile code that uses it.
The FCL has many methods that have type names as part of their method names. For example, the BinaryReader type offers methods such as ReadBoolean, ReadInt32, ReadSingle, and so on, and the System.Convert type offers methods such as ToBoolean, ToInt32, ToSingle, and so on. Although it's legal to write the following code, the line with float feels very unnatural to me, and it's not obvious that the line is correct:
1 2 3
| BinaryReader br = new BinaryReader (...);
float val = br .ReadSingle(); // OK, but feels unnatural
Single val = br .ReadSingle(); // OK and feels good |
好了。我认为这些都是非常好的观点。但是,我没有在自己的代码中使用Jeffrey的建议。也许我太执着于我的c#世界了,但最终我试图让我的代码看起来像框架代码。
- 第二点听起来像是不使用string、int等的理由。
- @MauganRa,这本书的作者列出了他不使用别名的原因。
- "如果有人正在阅读c#源代码,他们应该根据语言规范解释很长时间,而不是其他语言规范。"这完全没有抓住重点。这并不是说任何人都想曲解代码,当一个类型的含义与程序员每天在另一个上下文中看到的含义不同时,一个人的大脑很容易得出错误的结论。我们都会犯错;使用显式命名的类型可以减少这些错误。
- @Darryl -我记得用。net 1编程。安装在Windows XP 32x上。其中一个内核api需要一个long,对于我传入的结构,我一直使用.NET来获得溢出错误;它必须是. net int /Int32才能转换成内核的long定义。所以还有混乱的空间!msdn.microsoft.com/en-us/library/windows/desktop/…
- 这些理由总结了我对这件事的看法。当我第一次开始用c#编码时(来自Java/ c++ /C背景),我认为别名很难看。我仍然有这种感觉,不幸的是,世界上大多数人似乎不同意我的观点,或者他们不关心,所以用小写字母。
- 整数的"位"依赖于编译器,而不是语言。使用"long"获得溢出的原因不是因为内核,而是因为编译器。Microsoft 16位编译器使用16位整数大小,32位编译器使用32位整数大小。"string":实际上是char*的"别名",但这在. net中是不存在的——这就是为什么IntPtr没有基本等价的——没有指针。
- 问题是关于c#的,在c#中,long被定义为一个带符号的64位整数,无论平台或编译器是什么。所以,至少在某些情况下,这确实取决于语言。
- 到目前为止我找到的最好的一本书是《CLR via c#》……"
string是一个保留字,但String只是一个类名。这意味着string本身不能用作变量名。
如果出于某种原因,你想要一个名为string的变量,你只会看到其中的第一个编译:
1 2
| StringBuilder String = new StringBuilder (); // compiles
StringBuilder string = new StringBuilder (); // doesn't compile |
如果你真的想要一个名为string的变量名,你可以使用@作为前缀:
1
| StringBuilder @ string = new StringBuilder (); |
另一个关键区别是:堆栈溢出以不同的方式突出显示它们。
- 请记住,调用本地名称@string实际上是相当没有意义的,因为本地名称只出现在pdb中。不妨叫它_string什么的。对于那些可以通过反射访问名称的事物,它更有意义,其中@string成员的名称将是"string"。
- 还要记住,使用保留字作为变量名是非常不优雅的。
- "堆栈溢出以不同的方式突出显示它们"。无需更多理由:)
- OP不希望使用String或String作为变量名。他们要求对这些类型之间的差异作出解释。我认为你的回答只会增加更多的混乱
- 究竟为什么要考虑创建一个隐藏类型名称的变量呢?
- @craig如果你写软件是为了教人们如何打结?
- @Simon_Weaver绳结?哈哈,不错。:)当然,您可以选择另一个名称,比如thread。等一下…分析!
有一个区别-你不能使用String没有事先using System;。
- 默认情况下,大多数人都会以任何方式在文件的顶部添加这个。VS在大多数情况下都默认这样做!
- 默认情况下,我只添加我需要的using语句,并显式地删除我不需要的所有语句。Power Productivity Tools >"[x] Remove and Format use on save"
- @JMD我已经修改了.cs模板文件,所以它的顶部甚至没有任何using语句!我还将类模板更改为internal sealed。
- @JMD我讨厌这个功能。它有时会对未触及的文件进行更改,使得很难看到更改集中包含哪些实际更改。当然,我通常会删除"使用垃圾邮件",但只是主动删除,而不是自动删除。
- c#可能是这样,但不是所有。net语言都是这样。(Powershell默认导入系统名称空间。)
上面已经讲过了;但是,不能在反射中使用string;您必须使用String。
System.String是. net字符串类——在c#中string是System.String的别名——所以在使用中它们是相同的。
至于指导方针,我不会陷得太深,只要你喜欢就好了——生活中还有更重要的事情,代码也会是一样的。
如果你发现自己构建系统,有必要指定要使用整数的大小,所以倾向于使用Int16, Int32, UInt16、UInt32等那么就会更自然的使用String -当移动之间不同的。net语言可能会让事情更容易理解,否则我会使用字符串和整数。
- 在这里,我觉得又有一个关于一件小事的投票问题:en.wikipedia.org/wiki/parkinson_law_of_triviality
- 只要选择一个并保持一致。如果你在一个房子风格的地方工作,就用它。
- 不幸的是,样式是个人偏好,在没有专用代码所有者的情况下跨多个团队在大型代码库中实施样式可能过于昂贵。总是有更重要的事情要处理,而不是字符串对字符串。这让我们回到"生活中更重要的事情"
- 这绝对是一种偏好;例如:我更喜欢使用short、int、ushort、uint而不是Int16等等。主要是因为我就是这样学习的。当然,对于经验较少的人来说,Int16更容易立即理解。+ 1我!
出于格式原因,我更喜欢大写的.NET类型(而不是别名)。.NET类型的颜色与其他对象类型相同(毕竟值类型是正确的对象)。
条件和控制关键字(如if、switch和return)为小写,颜色为深蓝色(默认情况下)。我不希望在使用和格式上有分歧。
考虑:
1 2
| String someString;
string anotherString; |
- 您是否还编写了这样的代码:Int32 i = 1;而不是int i = 1;吗?当字符串别名可用时,不使用它似乎不一致。
- @nashwan:实际上,是的,我确实使用了Int32 i=1; intinstead of int i = 1;,我发现前者对于我的意图更易于阅读:即我想要一个32位带符号的整数。
- 我想这完全取决于开发人员认为他们是在编写c#代码(string)还是. net代码(string)。就我个人而言,我最重要的想法是我在编写c#(而且c#使用的是。net)。
- 您特别需要32位带符号整数,而不仅仅是抽象整数,这很常见吗?
- 我的观点很简单,我喜欢在我的代码中非常具体,以消除歧义。
- 另一方面,我几乎总是使用var
- 没有歧义。c#将int定义为now和forever始终是一个32位带符号整数。对于其他别名也是一样的,short总是16位签名,等等。
- 在所有情况下,我也避免使用别名。我的直觉是,别名的存在只是为了让C开发人员在过渡到c#时更熟悉c#。我认为,近20年后,这种担忧就不那么重要了。
string和String在所有方面都是相同的(大写字母"S"除外)。这两种方法都不影响性能。
由于语法突出显示,大多数项目都首选小写string
- Jeffrey Richter建议在所有情况下都使用CLR类型(通过c#使用CLR),以避免这里发生的那种混淆。
- 很明显,不管你用S还是S,它都会引起这个问题,所以投反对票。,)
- Richter的意思是字符串不应该是一个选项——微软不应该在语言中有它。你不能否决里克特——他是一个传奇人物!:)
- 很好,乔恩,但我恰好同意里希特关于弦的观点。是的,我完全同意——CLR via c#太棒了!
- 我同意完全不使用别名可能更好。但是考虑到我们已经有了它们,我认为使用它们很好(但不是在方法名中)。
- "string"和"string"不一样。system . string"意味着"。因此,如果使用"String",则必须使用"using System"来包含名称空间
c#是一种与CLR一起使用的语言。
string是c#中的一种类型。
System.String是CLR中的一个类型。
当您与CLR string一起使用c#时,将映射到System.String。
理论上,您可以实现生成Java字节码的c#编译器。这个编译器的合理实现可能会将string映射到java.lang.String,以便与Java运行时库进行互操作。
- string不是c#中的类型;它是映射到CLR中的类型的保留字。
- @ cesar:根据ECMA-334,第8.2.1节:"c#提供了一组预定义的类型[…预定义的引用类型是对象和字符串。"
- 根据ECMA-334第9.4.3节,"string"是一个关键字。:-)我同意你的观点,如果你关注语义,"string"是一种类型,但如果你关注语法,我会说它是一个关键字(即保留字)。标准支持这两种观点(可能太含糊了!)对我来说,OP是关于语法的,所以我在看答案时倾向于关注语法,但我也明白你的意思。此外,按照目前的情况,您的答案可能被解释为存在两种不同的类型:string和string,而实际情况并非如此。一个是映射到另一个。
- 让我们弄清楚这一点。'string'是一个保留别名。它不是真正的数据类型。它是指向其他东西的东西。您可以删除所有这些别名(或者永远不使用它们),并拥有一个完美的编程语言。
这段YouTube视频实际上展示了它们的不同之处。
但现在是一个很长的文本回答。
当我们谈论.NET时,有两种不同的东西,一种是.NET框架,另一种是使用该框架的语言(C#、VB.NET等)。
a.k."System.String"。"String"(大写"S")是.NET框架数据类型,而"String"是C#数据类型。
简言之,"String"是"String"的别名(用不同的名称调用相同的东西)。因此,从技术上讲,下面的代码语句将给出相同的输出。
1
| String s ="I am String"; |
或
1
| string s ="I am String"; |
同样,还有其他c#数据类型的别名,如下所示:-
对象:System.Object、字符串:System.String、bool: System.Boolean、字节:System.Byte、sbyte: System.SByte、short: System.Int16等等
现在,从程序员的角度来看,最重要的问题是什么时候使用"String"和"String" ?
避免混淆的第一件事是始终使用其中之一。但是从最佳实践的角度来看,当您进行变量声明时,最好使用"string"(小写的"s"),当您使用它作为类名时,则首选"string"(大写的"s")。
在下面的代码中,左边是一个变量声明,它使用"string"声明。在右边,我们正在调用一个方法,因此"String"更合理。
1
| string s = String.ToUpper() ; |
- 简言之,"String"是"String"的别名(用不同的名称调用相同的东西)。这是不正确的:别名是"string"。
- 当您进行变量声明时,最好使用"string"(小写的"s"),当您使用它作为类名时,则首选"string"(大写的"s")。这个约定似乎不再有效:如果您使用Visual Studio 2015并尝试编写String,它建议您"简化代码",将其携带到string……
string只是System.String的别名。编译器将以相同的方式处理它们。
惟一的实际区别是您提到的语法高亮显示,如果使用String,则必须编写using System。
- 您不需要在系统前面加上前缀来使用字符串。
- 在使用String时,必须包含一个using System,否则会得到以下错误:The type or namespace name 'String' could not be found (are you missing a using directive or an assembly reference?)
小写的string是System.String的别名。它们在C#中是相同的。
对于应该使用系统类型(System.Int32、System.String等)还是使用C# aliases (int、string等),存在争议。我个人认为你应该使用C# aliases,但那只是我个人的偏好。
- 这就是问题所在,它们不是"c#"别名,而是"C"别名。c#语言中没有原生的"string"或"int",只有语法糖。
- 不确定"C"从何而来,因为c# 5语言规范在第85页第4.2.4段中读到"关键字字符串只是预定义类System.String的别名"。所有高级语言都是CPU指令集和字节码之上的语法糖。
两者都是相同的。但是从编码准则的角度来看,使用string比使用String更好。这是开发人员通常使用的方法。例如,我们不使用Int32而是使用int,因为int是Int32的别名。
仅供参考关键字字符串只是预定义类System.String的别名。——c#语言规范4.2.3http://msdn2.microsoft.com/En-US/library/aa691153.aspx
就像其他人说的,它们是一样的。默认情况下,StyleCop规则将强制您使用string作为c#代码风格的最佳实践,除非引用System.String静态函数,如String.Format、String.Join、String.Concat等……
- 我不知道StyleCop会标记String use——除了静态方法。我认为这很好,因为我总是这样使用它:string用于类型声明,string用于访问静态成员。
使用系统类型可以更容易地在c#和VB之间进行移植。如果你对这类事情感兴趣的话。
- 在c#和VB之间进行转换。NET本身就很简单。developerfusion.com/tools/convert/vb-to-csharp
与其他程序员中常见的实践相反,我更喜欢String而不是string,这只是为了强调一个事实,即String是引用类型,正如Jon Skeet所提到的。
string是System.String的别名(或简写)。这意味着,通过输入string,我们的意思是System.String。您可以在think链接中阅读更多信息:"string"是System.String的别名/缩写。
String (System.String)是基类库中的一个类。string(小写)是c#中的一个保留工作,它是System.String的别名。Int32与int的情况类似于Boolean vs. bool。这些特定于c#语言的关键字使您能够以类似于C的样式声明基元。
我想补充一下lfousts的回答,来自Ritchers的书:
The C# language specification states,"As a matter of style, use of the keyword is favored over
use of the complete system type name." I disagree with the language specification; I prefer
to use the FCL type names and completely avoid the primitive type names. In fact, I wish that
compilers didn’t even offer the primitive type names and forced developers to use the FCL
type names instead. Here are my reasons:
I’ve seen a number of developers confused, not knowing whether to use string
or String in their code. Because in C# string (a keyword) maps exactly to
System.String (an FCL type), there is no difference and either can be used. Similarly,
I’ve heard some developers say that int represents a 32-bit integer when the application
is running on a 32-bit OS and that it represents a 64-bit integer when the application
is running on a 64-bit OS. This statement is absolutely false: in C#, an int always maps
to System.Int32, and therefore it represents a 32-bit integer regardless of the OS the
code is running on. If programmers would use Int32 in their code, then this potential
confusion is also eliminated.
In C#, long maps to System.Int64, but in a different programming language, long
could map to an Int16 or Int32. In fact, C++/CLI does treat long as an Int32.
Someone reading source code in one language could easily misinterpret the code’s
intention if he or she were used to programming in a different programming language.
In fact, most languages won’t even treat long as a keyword and won’t compile code
that uses it.
The FCL has many methods that have type names as part of their method names. For
example, the BinaryReader type offers methods such as ReadBoolean, ReadInt32,
ReadSingle, and so on, and the System.Convert type offers methods such as
ToBoolean, ToInt32, ToSingle, and so on. Although it’s legal to write the following
code, the line with float feels very unnatural to me, and it’s not obvious that the line is
correct:
1 2 3
| BinaryReader br = new BinaryReader (...);
float val = br .ReadSingle(); // OK, but feels unnatural
Single val = br .ReadSingle(); // OK and feels good |
Many programmers that use C# exclusively tend to forget that other programming
languages can be used against the CLR, and because of this, C#-isms creep into the
class library code. For example, Microsoft’s FCL is almost exclusively written in C# and
developers on the FCL team have now introduced methods into the library such as
Array’s GetLongLength, which returns an Int64 value that is a long in C# but not
in other languages (like C++/CLI). Another example is System.Linq.Enumerable’s
LongCount method.
我读完整段之前没有得到他的意见。
迟到:我100%的时间都在使用CLR类型(好吧,除非被迫使用c#类型,但我不记得上次是什么时候)。
我最初是在几年前开始做的,根据里奇的CLR书籍。对我来说,所有CLR语言最终都必须能够支持一组CLR类型是有意义的,所以您自己使用CLR类型可以提供更清晰的、可能更"可重用"的代码。
现在我已经做了很多年了,这是一种习惯,我喜欢VS为CLR类型显示的颜色。
唯一真正令人沮丧的是auto-complete使用了c#类型,所以我最终重新键入自动生成的类型来指定CLR类型。
而且,现在,当我看到"int"或"string"时,它看起来真的不对,就像我在看1970年的C代码一样。
String不是关键字,它可以用作标识符,而string是关键字,不能用作标识符。从函数的角度来看,两者是一样的。
这是惯例问题,真的。string看起来更像C/ c++风格。一般惯例是使用您选择的语言提供的任何快捷方式(int/ int for Int32)。这同样适用于"object"和decimal。
理论上,这可以帮助将代码移植到未来的64位标准中,其中"int"可能意味着Int64,但这不是重点,我希望任何升级向导都能更改对Int32的任何int引用,以确保安全。
没有区别。
c#关键字string映射到. net类型System.String—它是一个保持语言命名约定的别名。
类似地,int映射到System.Int32。
- 在64位构建中,int映射到系统。Int64(8字节),在32位构建它映射到系统。Int32(4字节)
- @Alex:没有,请查看msdn.microsoft.com/en-us/library/ya5y69ds.aspx
- IntPtr和UIntPtr是惟一根据平台改变大小的类型(不考虑实际指针类型,如int*和由[U]IntPtrs或实际指针组成的类型)。
- stackoverflow.com/questions/651956/sizeofint-on-x64
6年零5个月后的新答案(拖延)。
string是一个保留的c#关键字,它总是有一个固定的含义,而String只是一个普通的标识符,它可以引用任何东西。根据当前类型、当前名称空间和应用的using指令的成员及其位置,String可以是与global::System.String不同的值或类型。
我将提供两个using指令不起作用的例子。
首先,当String是当前类型的值(或局部变量)时:
1 2 3 4 5 6 7 8 9
| 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)很可能(取决于using)转到Linq扩展方法Enumerable.Concat。它不会转到静态方法string.Concat。
其次,当String是另一种类型时,嵌套在当前类型中:
1 2 3 4 5 6 7 8 9 10 11 12
| class MyPiano
{
protected class String
{
}
void Example()
{
var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
String test2 ="Goodbye";
}
} |
Example方法中的任何语句都不能编译。这里String总是一根钢琴弦,MyPiano.String。它上面不存在成员(static或不存在)(或从基类继承)。值"Goodbye"不能转换为它。
- 我想一个人可以像恶魔一样:using String = System.Int32; using Int32 = System.String;然后数虫子。
- 这是正确答案。string System.String。String可以是任何东西。
丹尼尔·索利斯(Daniel Solis)的书中有一段关于这个问题的引文。
All the predefined types are mapped directly to
underlying .NET types. The C# type names (string) are simply aliases for the
.NET types (String or System.String), so using the .NET names works fine syntactically, although
this is discouraged. Within a C# program, you should use the C# names
rather than the .NET names.
string是一个关键字,不能使用string作为标识符。
字符串不是关键字,你可以用它作为标识符:
例子
1
| string String ="I am a string"; |
关键字string是…的别名System.String除了关键字问题外,这两个问题是完全相同的等价的。
- 唯一微小的区别是,如果使用String类,需要在文件顶部导入系统名称空间,而在使用String关键字时不必这样做。
是的,它们之间没有区别,就像bool和Boolean一样。
这两者之间没有区别——但是,在考虑其他开发人员的源代码时,string似乎是首选选项。
有一个参数没有在其他地方提到,更喜欢pascal case String:
System.String是一个引用类型,按照惯例,引用类型名是pascal case。
- -1按照惯例,所有类型名称都是pascal case。但是c#关键字都是小写的。
- @PDaddy是的,而string确实是一个c#关键字。这里的问题是选择关键字还是类型名称。我的回答是,虽然您显然可以选择关键字,但是支持使用类型名称的一个参数是,they关键字string是String的别名,它最终是一个引用类型。相反,关键字int是值类型Int32的别名。
- 参考类型和值类型之间的大小写约定没有区别,正如您自己提到的Int32类型所证明的那样。为了类名而避免使用关键字,以遵守一些假想的限制,即引用类型遵循不同于值类型的命名约定,这是没有意义的。
- 是的,你是对的。我在这里延续了Java约定,其中原语是camelCase。
两者是一样的。区别在于你如何使用它。公约,
字符串用于变量
String用于调用其他String类方法
如:
1 2 3 4 5 6 7 8 9
| string fName ="John";
string lName ="Smith";
string fullName = String.Concat(fName,lName);
if (String.IsNullOrEmpty(fName))
{
Console.WriteLine("Enter first name");
} |
- 这个约定不再有效:如果您使用Visual Studio 2015并尝试使用String,程序建议您"简化代码",并将其携带到string。
实际上没有区别
c#关键字字符串映射到. net类型系统。字符串——它是一个别名,保持了该语言的命名约定。
String引用一个字符串对象,该对象带有用于操作所包含字符串的各种函数。
string引用一个基本类型
在c#中,它们都编译成String,但在其他语言中,它们不编译成String,所以如果想处理String对象,应该使用String;如果想处理文字,应该使用String。
- 注意命名这些其他语言,因为我知道在。net中没有string != System.String。此外,文字与字符串与字符串无关…
- 完全错误的
- 真的有26名选民相信这是正确的吗?
- @Andy,当我回答这个问题的时候,我正在使用Java,这确实有区别,我不确定当我回答这个问题的时候,是否指定了。net,因为它已经被编辑过了
如果真的看到string和System.String之间没有区别是有用的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| var method1 = typeof(MyClass ).GetMethod("TestString1").GetMethodBody().GetILAsByteArray();
var method2 = typeof(MyClass ).GetMethod("TestString2").GetMethodBody().GetILAsByteArray();
//...
public string TestString1 ()
{
string str ="Hello World!";
return str ;
}
public string TestString2 ()
{
String str ="Hello World!";
return str ;
} |
两者产生完全相同的IL字节数组:
1
| [ 0, 114, 107, 0, 0, 112, 10, 6, 11, 43, 0, 7, 42 ] |
- 我已经给了你一个+1,但你的实际方法,当优化+打开时,是相同的return"Hello World!";。为了确保类型被"考虑",您可以使用return (string)(object)typeof(string).Name;和return (System.String)(System.Object)typeof(System.String).Name;,这恰好也确认了System.Object和object是相同的:-)
string和String之间有一个实际的区别。
1 2
| nameof(String); // compiles
nameof(string); // doesn't compile |
这是因为string是关键字(在本例中是别名),而String是类型。
其他别名也是如此。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| | Alias | Type |
|-----------|------------------|
| bool | System.Boolean |
| byte | System.Byte |
| sbyte | System.SByte |
| char | System.Char |
| decimal | System.Decimal |
| double | System.Double |
| float | System.Single |
| int | System.Int32 |
| uint | System.UInt32 |
| long | System.Int64 |
| ulong | System.UInt64 |
| object | System.Object |
| short | System.Int16 |
| ushort | System.UInt16 |
| string | System.String | |
您不需要导入名称空间(使用System;)来使用string,因为它是System.String的全局别名。
要了解更多关于别名的信息,可以查看此链接。
首先,两个(弦和放大器;字符串)是不一样的。这是有区别的:String不是关键字,它可以用作标识符,而String是关键字,不能用作标识符。
我试着用不同的例子来解释:首先,当我把"string s;"放入Visual Studio并悬停在它上面时,我得到(没有颜色):
这说明字符串是系统。字符串,对吧?文档位于https://msdn.microsoft.com/en-us/library/362314fe.aspx。第二句是"string是. net框架中string的别名。"
- 所以它们内部是一样的。意思是,它们指向同一事物,并且可以互换使用。它们的区别在于,该字符串是定义的实际结构的名称,而String是指向相同结构的别名。它(字符串)是一个别名,这使得它成为一个关键字,这就是为什么VS将它们显示为不同的颜色。如果右键单击查看字符串的定义,您将会看到struct字符串。
两者之间没有区别。您可以在代码中使用它们中的任何一个。
System.String是在名称空间System中定义了mscorlib的类(引用类型)。换句话说,System.String是CLR中的一个类型。
string是C#中的一个关键字
杰弗里·里写:
Another way to think of this is that the C# compiler automatically
assumes that you have the following using directives in all of your
source code files:
1 2 3 4
| using int = System.Int32;
using uint = System.UInt32;
using string = System.String;
... |
I’ve seen a number of developers confused, not knowing whether to use
string or String in their code. Because in C# string (a keyword) maps
exactly to System.String (an FCL type), there is no difference and
either can be used.
老实说,在实践中,制度之间通常没有区别。字符串和字符串。
c#中的所有类型都是对象,并且都是从System派生的。对象类。一个不同之处在于string是c#关键字,您可以使用string作为变量名。系统。String是这种类型的常规. net名称,String是方便的c#名称。这是一个简单的程序,它显示了不同的系统。字符串和字符串。
1 2 3 4 5 6 7 8
| string a = new string(new char[] { 'x', 'y', 'z' });
string b = new String(new char[] { 'x', 'y', 'z' });
String c = new string(new char[] { 'x', 'y', 'z' });
String d = new String(new char[] { 'x', 'y', 'z' });
MessageBox .Show((a .GetType() == typeof(String) & ;& ; a .GetType() == typeof(string)).ToString()); // shows true
MessageBox .Show((b .GetType() == typeof(String) & ;& ; b .GetType() == typeof(string)).ToString()); // shows true
MessageBox .Show((c .GetType() == typeof(String) & ;& ; c .GetType() == typeof(string)).ToString()); // shows true
MessageBox .Show((d .GetType() == typeof(String) & ;& ; d .GetType() == typeof(string)).ToString()); // shows true |
@JonSkeet在我的编译器中
1
| public enum Foo : UInt32 { } |
是有效的。我有Visual Studio 2015社区。
在MSDN文档的上下文中,String类与BCL中的任何其他数据类型(例如,XmlReader、StreamReader)一样被文档化。
string像关键字(c# Reference)或任何基本的c#语言构造(例如,for、while、default)一样被记录下来。
参考。
正如所指出的,它们是相同的东西,string只是String的别名。
值得注意的是,我使用string来声明类型——变量、属性、返回值和参数。这与使用其他系统类型(int, bool, var etc)是一致的(尽管Int32和Boolean也是正确的)。
当使用String类上的静态方法时,我使用String,比如String.Split()或String.IsNullOrEmpty()。我觉得这更有意义,因为方法属于一个类,而且它与我使用其他静态方法的方式一致。
string等于System.String在VS2015中如果你写这个
然后编译器会显示潜在的修复程序来优化它,在应用了修复程序之后,它会像这样
字符串是用于表示文本的字符的顺序集合。
String对象是系统的顺序集合。表示字符串的Char对象;一个系统。Char对象对应于一个UTF-16代码单元。
String对象的值是系统的顺序集合的内容。Char对象,并且该值是不可变的(即,它是只读的)。
有关字符串的不可变性的更多信息,请参见msdn中的不可变性和StringBuilder类部分。
内存中字符串对象的最大大小为2GB,即大约10亿个字符。
注意:答案摘自msdn帮助部分。您可以在备注部分的msdn字符串类主题中看到完整的内容
在c#中,string是System的简短版本。字符串(字符串)。它们的意思基本相同。
就像有人提到的,它就像bool和Boolean一样,没什么区别。
String: String对象被称为不可变的(只读的),因为它的值一旦创建就不能被修改。看起来修改字符串对象的方法实际上返回一个包含修改的新字符串对象。如果需要修改类字符串对象的实际内容
string: string类型表示一个由0个或多个Unicode字符组成的序列。string是. net框架中string的别名。string是固有的c#数据类型,是系统提供的类型"system . string"的别名。c#规范声明,作为一个样式问题,关键字(字符串)优先于完整的系统类型名称(系统)。字符串或字符串)。虽然string是一种引用类型,但是定义了相等运算符(==和!=)来比较string对象的值,而不是引用。这使得字符串相等性的测试更加直观。例如:
弦与放大器的区别;字符串:
string通常用于声明,而
String用于访问静态字符串方法您可以使用
'string'来声明使用预定义类型
'string'的字段、属性等,因为c#规范告诉我这是一种很好的样式。您可以使用
'String'来使用系统定义的方法,比如String。比较等。它们最初是在"System"上定义的。字符串",而不是"字符串"。在本例中,
'string'只是一个别名。您还可以使用
'String'或'System。当与其他系统通信时,特别是与clr兼容时。也就是说,如果我从其他地方获取数据,我会将其反序列化到一个系统中。如果根据定义,起源不是c#系统,那么应该是Int32而不是int。
- 你从哪儿弄来的?这完全是一派胡言:String和string完全是一回事。
据我所知,string只是System.String的别名,类似的别名还有bool、object、int……唯一细微的区别是,您可以使用string而不需要"using System;"指令,而String需要它(否则您应该完整地指定System.String)。
哪一种是最好的,我想这是品味的问题。就我个人而言,我更喜欢string,但这不是一个宗教问题。
我更喜欢使用string,因为这种类型使用得太多,所以我不希望语法高亮体将它与所有其他类混合在一起。虽然它是一个类,但它更像是一个基元,因此我认为不同的高亮颜色是合适的。
如果您右键单击string关键字并从上下文菜单中选择Go to definition,它将把您带到String类—这只是语法上的糖,但我认为它提高了可读性。
字符串:表示一个类
字符串:表示别名
It's just a coding convention from microsoft .
string是System.String的短名称。String或System.String是CTS(Common Type System)中的字符串名称。
string是. net框架中string的别名。
其中"String"实际上是System.String.
我想说的是,它们是可以互换的,在什么时候、什么地方使用它们没有区别。
但是,最好与您使用的是哪个一致。
值得注意的是,我使用string来声明类型——变量、属性、返回值和参数。这与使用其他系统类型—int, bool, var etc是一致的(尽管Int32和Boolean也是正确的)。
当使用String类上的静态方法时,我使用String,比如String.Split()或String.IsNullOrEmpty()。我觉得这更有意义,因为方法属于一个类,而且它与我使用其他静态方法的方式一致。
您已经知道string只是System.String的别名。但是我应该用什么呢?这只是个人喜好。
在我的例子中,我喜欢使用string而不是System.String,因为String需要一个名称空间using System;或一个全名System.String。
所以我相信别名string是为了简单而创建的,我喜欢它!
字符串是System.String的快捷方式。惟一的区别是您不需要引用System.String名称空间。所以使用字符串比使用字符串更好。
通常使用c#关键字声明变量。事实上,每个c#类型在。net中都有一个等价的。另一个例子是,c#中的short和int映射到. net中的Int16和Int32。从技术上讲,字符串和字符串没有区别,但是在c#中,string是. net framework中的string类的别名。
String是string的类。如果从使用语句中删除System名称空间,您可以看到String已经消失,但是string仍然在这里。string是字符串的关键字。就像int and Int32
short and Int16
long and Int64关键字就是一些使用类的单词。这些关键字由c#指定(所以是Microsoft,因为c#是Microsoft的)。简单地说,没有区别。使用string or String。这并不重要。他们是相同的。
String只是String类的别名。如果你想使用string类的函数,那么你应该使用string else,你应该坚持使用string。例如,如果您想格式化一个字符串,那么您应该使用string类来使用String.Format(),但是如果您只是想定义字符串,那么您应该使用string test="";请注意,它们都是引用类型。