在C中,我想用空字符串初始化字符串值。
我该怎么做?正确的方法是什么?为什么?
1
| string willi = string.Empty; |
或
1
| string willi = string.Empty; |
或
或者什么?
- 也可以看到类似的关于Java的讨论:StasPox.com /问题/ 213985 / & Helip;
- 更重要的是,永远不要将字符串与sting.empty进行比较。坏:如果(s="")好:如果(s.length==0)
- 最好使用string。不过,确实是空的(string mystring)吗?
- 我使用[string.isNullorWhitespace(stringValue)]…在.NET 4.0中工作。要初始化,我只需使用[var text="";]简单、易读且键入所需时间最少:)
- 更重要的是变量的搞笑名称。
- 令我感兴趣的是,为什么这里甚至还有一个空房子。一切都很好,但不是必须的。
- string.empty和""(empty string)之间的差异可能是什么?
- stackoverflow.com/questions/16618302/…
- @zombiesheep不能使用isNullOrEmpty设置字符串变量的值…
- 另外,如果使用代码混淆。可以对string.empty进行模糊处理,因为""不会被模糊处理。再说一次,如果你在使用某种模糊的方法,这不是一个巨大的区别,也没有那么重要,但这是一个区别。
使用你和你的团队认为最可读的东西。
其他答案建议每次使用""时都创建一个新字符串。这不是真的-由于字符串内部化,它将在每个程序集或每个AppDomain上创建一次(或者可能在整个过程中创建一次-在前面不确定)。这种差异是可以忽略的-很大,很大程度上是微不足道的。
然而,你发现更具可读性的是另一回事。这是主观的,而且会因人而异——所以我建议你找出你团队中大多数人喜欢什么,并且为了一致性,所有人都这样做。就我个人而言,我觉得""更容易阅读。
关于江户一号(0)和江户一号(3)很容易被误认为是对方的说法,我并不认同。除非你使用的是比例字体(我还没有和任何开发人员合作过),否则很容易分辨出不同之处。
- 当你期望看到"你很容易把"错为"的时候,你的眼睛会欺骗你。这就是为什么编辑别人写的东西更容易的原因。你的大脑对文本没有先入为主的想法,因此更容易辨别出异常。
- @Tvanfosson:那么你(或者你的同事)真的被这个虫子咬了吗?我对这种说法很怀疑,因为它实际上没有引起问题。我用了""好几年都没有出错…
- 乔恩,我用了10磅的SegoeUI和Beautiful,不管怎样标签都很完美,这样我可以有更长的线条。也许我不是一个开发者那么:d
- @艾伦:我会试试看是什么样子。个人而言,我使用空格代替制表符(并将努力做到这一点;)我怀疑这会使它在排列位参数等方面工作得不太好。不过值得一试。
- 我一直使用string.empty,所以没有。另一方面,我经常编辑我的so文章,因为我把文章发出去之前看不到的单词弄乱了,并用了双排字。我只是说,为什么要冒险。而且,不,我不会得到角色的报酬。
- 为什么要冒险?因为我发现""比string.empty更可读。否则我肯定会用后者。然而,考虑到一个明确的个人偏好和一个从未咬过我的潜在风险,我认为选择团队认为最可读的代码是合理的。
- @乔恩:我也用空格代替制表符,我不是指文字制表符而是缩进。对不起。请试一试---我以前是一个信使新的/摩纳哥/露西达-桑斯打字机迷,但我试过一次Segoe用户界面,再也没有回头过:)
- @艾伦:现在变了。可能很适合用于演示文稿-很高兴在屏幕上显示更多内容,特别是当字体全部放大时…
- @乔恩:如果你读了我的答案,你会发现我表达了个人的偏好,对我来说,是一个理性的理由。你不同意。也许当你40多岁的时候,你的视力开始下降,你可能会改变你的观点。-)
- @Tvanfosson:我会改变我的观点,当我看到它导致了一个真正的而不是感知到的问题的证据时:)我认为,当没有看到这样的错误时,声称引入一个错误相对容易是一种夸大。但是的,都是个人意见。
- 就我个人而言,我总是使用string.empty,每当我想对string使用静态方法时,我都使用大写字母"s",它只是一个个人引用,允许我区分类型和变量。但这只是使用StrugUnLes的一个继承。其中一个有趣的地方是我几乎是瞎的,这确实有助于我的可读性。
- @布雷特:另一方面,在Visual Studio中,"字符串"以不同的颜色结束。如你所说,这是个人喜好…
- 你给了我灵感,让我开始在新罗马时代发展。
- 我认为"问题"不是它引入了错误(我也从来没有这样做过),而是它的可读性较低,有时您需要查看字符串是初始化为空字符串""还是空间""。当然,将字符串初始化为空格是非常罕见的,但我仍然经常无意识地进行检查。因此,我总是和String.Empty一起走,因为从第一眼就看得很清楚。
- @gehho:你觉得它不太可读——很好——但我觉得它比String.Empty更可读。使用单间距字体,""和""之间的区别对我来说非常明显,并且String.Empty不必要地混乱。但这只是个人喜好。
- @乔恩:当然-个人喜好!我只是想回复你对Nov 4 '08 at 20:27的评论,你问它是否引入了一个bug。不是它引入了错误,而是我(无意识地)需要更多的时间来解释它(这是(毫秒),但仍然是…)。我认为其他提到这个案例的人(比如Tvanfosson和BrettRyan)就是这个意思。我不想说服你使用String.Empty,我只是想解释一些人喜欢它的原因。:)
- ①我使用比例字体,很容易区分""和""(可能取决于字体);②即使在视觉上很难区分它们,我认为在应该是哪种字体的情况下,它通常也能与代码区分清楚。
- +1对于比例字体,但是的,需要仔细选择或手动编辑字体,因为大多数字体的空间太窄。
- ""看起来不像"",但可能与'"'混淆。
- @本:不能说我有过这个问题……尤其是在许多情况下,由于类型不同,它是无效的。
- 就我个人而言,我发现我的大脑在解释一个简单的模式""时比解释string.empty(嘿,有一个类和一个属性-它在做什么?)要消耗更少的能量。所有使用string.empty的人都使用string.space(1)吗?如果没有难以区分的空间,那么一个或多个空间也可能是。
- 唯一可能的混淆点是一个双引号和两个单引号…(vs'')==wtf!?!?!任何"有能力"的程序员都可以同样轻松地处理var s=""或var s=string.empty。但是通过阅读这里的评论…很高兴看到其他人对节目风格有着可悲的、类似宗教信仰的确认,这真的不重要。我以为我是一个人。叹息。
- string.empty的最大优点是,您可以更容易地在诸如Visual Studio之类的IDE中找到它的精确用法。对于""的一个简单的"find"操作将在注释中返回转义引号和""表示,以及您实际要查找的用法。执行string.empty的"find usages"代码检查类型将获得IT解决方案范围内的所有用法,其中,查找字符串文字(如"")的用法仅限于在其中定义的程序集范围内。
- @mutantnijacodemonkey:我不记得曾经在代码库中搜索过"",如果我这样做了,我在注释或逐字字符串文本中使用""就足够小了,我不会太担心。如果这真的是String.Empty的最大优势,那么在我看来这是一个相当小的优势。
- @我想,Jonskeet依赖于项目和应用于它的编码标准(如果有的话)。我想我同意这对90%的项目来说是一个微不足道的优势。在我的经验中,空字符串通常用于初始化,或者作为为一个字符串打开方法的一种方法,否则该字符串将被视为空。有时,很高兴知道这种模式在解决方案范围内的应用位置。当然可以使用一个通用的"find"来查找这些内容,但是对于代码中的任何模式都可以这样说。但是是的…在大多数情况下,这种情况可能不会经常发生。
- 关于节目偏好的辩论就像是关于食物偏好的辩论。不可能证明一个比另一个更好,因为使用它的人没有实际的区别。可以肯定的是,一种对另一种的持续使用,当他们不得不改变他们的习惯时,必然会给适应能力较差的人带来一些困难,但事实上,多样性应该给予每个人发展自己风格的自由,尽管这种选择的自由导致了更多的战争(武装的和火焰的)比任何事情都要多。伦敦证券交易所。
- 由于一些不明确的原因,string.Empty不是一个常数。这意味着在许多需要编译时常量的情况下,string.Empty甚至不合法。这包括switch语句中的case""块、可选参数的默认值、应用属性时的参数和属性,以及许多其他情况(留给读卡器)。因此,在一些常见情况下,不允许使用string.Empty,最好使用""无处不在的公约。
- 我总是喜欢string.empty,除了做string.replace("xxx","")时。
- 我还开发了javascript、vbscript、SQL和vb6…当string.empty只能在.NET中工作时,""(或"")在任何地方都可以工作。我喜欢在同一个产品中使用""来保持不同语言的一致性。
- Visual Studio 2015 Update 3 C编辑器的"快速操作"功能建议在各处始终"简化"string.Empty。当我接受这个建议时,它被转换成string.Empty。了解其背后的基本原理是很有趣的。
- 即使每个程序集或进程创建一次空字符串文本"",您知道它是从内存方面独立于string.Empty,还是在内存方面与string.Empty指向的相同?如果在调用string.Empty之前在程序中使用空字符串"",.net会使用interning吗?
- (我还没有与任何开发人员合作过)好吧,我不明白人们如何使用其他字体,然后将Verdana用于sourcode;-]
- 我本以为编译器会将""识别为等同于string.empty,并为这两种情况生成相同的代码。
从性能和代码生成的角度来看,确实没有什么不同。在性能测试中,它们来回切换,其中一个比另一个更快,而且仅以毫秒为单位。
在查看幕后代码时,您也没有看到任何区别。唯一的区别是IL,string.Empty使用操作码ldsfld。而""使用操作码ldstr,但这仅仅是因为string.Empty是静态的,两个指令都做同样的事情。如果您查看生成的程序集,它是完全相同的。
C码
1 2 3 4 5 6 7 8 9 10 11
| private void Test1()
{
string test1 = string.Empty;
string test11 = test1;
}
private void Test2()
{
string test2 ="";
string test22 = test2;
} |
IL码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| .method private hidebysig instance void
Test1() cil managed
{
// Code size 10 (0xa)
.maxstack 1
.locals init ([0] string test1,
[1] string test11)
IL_0000: nop
IL_0001: ldsfld string [mscorlib]System.String::Empty
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: stloc.1
IL_0009: ret
} // end of method Form1::Test1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| .method private hidebysig instance void
Test2() cil managed
{
// Code size 10 (0xa)
.maxstack 1
.locals init ([0] string test2,
[1] string test22)
IL_0000: nop
IL_0001: ldstr ""
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: stloc.1
IL_0009: ret
} // end of method Form1::Test2 |
汇编代码
1 2 3 4 5 6 7
| string test1 = string.Empty;
0000003a mov eax,dword ptr ds:[022A102Ch]
0000003f mov dword ptr [ebp-40h],eax
string test11 = test1;
00000042 mov eax,dword ptr [ebp-40h]
00000045 mov dword ptr [ebp-44h],eax |
1 2 3 4 5 6 7
| string test2 ="";
0000003a mov eax,dword ptr ds:[022A202Ch]
00000040 mov dword ptr [ebp-40h],eax
string test22 = test2;
00000043 mov eax,dword ptr [ebp-40h]
00000046 mov dword ptr [ebp-44h],eax |
- @Prateeksaluja:要查看IL,可以使用Visual Studio附带的ildasm.exe。若要查看分解,请在遇到断点时使用调试菜单上的"反汇编"窗口(也适用于版本代码)。
- 我不想推荐这个产品。但是…Reflector允许您在分解源代码时选择您的语言,IL是一个选项!Ildasm只是约会的感觉…微软工具团队似乎并没有打磨或发布好的工具!
最好的代码是完全没有代码:
The fundamental nature of coding is that our task, as programmers, is to recognize that every decision we make is a trade-off. […] Start with brevity. Increase the other dimensions as required by testing.
因此,代码越少越好:倾向于""而不是string.Empty或string.Empty。这两种语言的使用时间长了六倍,没有额外的好处——当然没有额外的清晰性,因为它们表达的信息完全相同。
- 但在c中,我们可以只说字符串。
- 我同意代码应该尽可能小,但一般不会认为字符越少代码越好。例如,当涉及到变量命名时,合理数量的字符通常比仅使用i和j产生更好的名称。
- @高度依赖的标记:对于表示索引的循环变量,i比长变量名更好。更一般的是,在同样清晰的情况下,传递相同信息的较短变量名总是更好的选择。只是为了表达必要的信息,你需要一个特定的字符长度,我不否认这一点(没有人是)。
- @康拉德:只有当循环很小并且不包含任何其他索引时,我才是一个好的变量名。但我同意,如果某事物能更简短地表达相同的信息,那就更可取了,就像在string.empty/"的情况下一样。空字符串不会增加任何清晰度。
- 对我来说:string.empty表示这个字符串在任何时候都是空的,而""表示在编写这个字符串时可以是空的,但是您可以自由地更改它。
- @Aeroson可以自由地按照你想要的方式解释一切,但是要知道,没有其他人会分享你高度独特的阅读,因此不要依赖它来传达你的意图:没有人会得到它。
- @Aeroson弦是不可变的,所以不会改变它们。如果您指的是更改变量中的内容,我不会根据最初分配给该变量的内容来假定这样的意图。
- 简洁性应该总是被可读性压倒。框架开发人员之所以添加String.Empty是有原因的,这不仅是为了解决性能问题,而且也是为了让它非常清楚其意图。在扫描代码的同时,识别(和搜索)比""容易得多。
- @Dandiplo你不能严肃地说String.Empty比""更易读。显然不是,而且与您的说法相反,没有证据表明框架开发人员是这样认为的(我不能理解他们的想法,但我很确定他们不会这么认为,而且,如果有的话,他们可能会认为它的存在是事后诸葛亮的错误)。让我们给埃里克·利珀特打个电话——尽管读这本书的机会很小。
- @Konradrudolph在微软最近的"在.NET框架中使用字符串的最佳实践"示例中,他们使用了String.Empty—请参见docs.microsoft.com/en-us/dotnet/standard/base-types/…
一个区别是,如果使用switch-case语法,则不能编写case string.Empty:,因为它不是常量。你得到一个Compilation error : A constant value is expected。
查看此链接了解更多信息:字符串空引号与空引号
- switch语句就是一个很好的例子。另外,如果你做了一个可选的参数,比如void MyMethod(string optional ="") { ... },也不可能使用string.Empty。当然,如果您想定义一个const字段或局部变量,那么const string myString ="";也是唯一的选择。如果只有string.Empty是一个常数场,就不会有什么区别。但事实并非如此,因此在某些情况下,您必须使用""。那么为什么不一直使用""?
- 这是一个非常有力的理由,因为使用string.Empty会阻止您在代码库中实现一致性:您必须使用两个不同的实体来表示相同的内容。在你不能做的事情列表中添加:你不能用string.Empty属性。
- 非常好的观点!链接已断开。以下是内容的副本:web.archive.org/web/20131230161806/http://kossovsky.net/…
我更喜欢string而不是string。选择string.Empty而不是""是选择并坚持的问题。使用string.Empty的好处在于,它非常明显地体现了您的意思,而且您不会意外地复制不可打印的字符,如"\x003"在您的""中。
- 我认为,如果您不小心将不可打印的字符复制到代码中,那么问题比这个问题更严重;)
- ascii 03恰好是我处理过的B2B消息的字段分隔符:)
- (我还建议避免x转义,顺便说一句,-"x9bad compiler"和"x9good compiler"之间的区别太难了,它们的结果完全不同!)
- 就我个人而言,每当对字符串调用静态方法时,我更喜欢字符串而不是字符串。但我几乎是瞎了眼,这是我个人的偏好,我不强制任何人。
- 我可能会宣布在埃多克斯(EDOCX1)(0)有一个警察。:)
- 我被类似的东西咬了一口,在一份新工作中,我得到了一个字符串包含无法打印字符的文档…:)
- 您使用复制/粘贴来键入""…?
- @蒂莫并不是字面上的例子。假设它正在从API文档复制一个带有嵌入的不可打印字符的文本块。
- @吉米当然知道,但我们说的是空弦。我声称,当复制/粘贴无效时,""是危险的,因为您从不复制/粘贴空字符串。当然,对于其他弦来说,它总是值得注意的。
我不想插话,但我看到一些错误的信息被扔到这里。
我个人更喜欢string.Empty。这是我个人的偏好,我服从于我在个案基础上与之合作的任何团队的意愿。
正如其他一些人提到的,string.Empty和string.Empty之间完全没有区别。
此外,这是一个鲜为人知的事实,使用""是完全可以接受的。""的每个实例都将在其他环境中创建一个对象。然而,.NET将其字符串进行实习生,因此将来的实例将从实习生池中提取相同的不可变字符串,并且任何性能影响都可以忽略不计。资料来源:Brad Abrams。
- 我不明白为什么"技术上"每个""实例都会创建一个对象。这不仅仅是字符串被囚禁的机会——它在C规范中。
我个人更喜欢"",除非有充分的理由去做更复杂的事情。
string.Empty和string.Empty是等效的。string是bcl类名;string是其C别名(如果愿意,也可以是快捷键)。与Int32和int相同。有关更多示例,请参阅文档。
至于"",我不太确定。
就我个人而言,我总是使用string.Empty。
几乎所有开发人员都知道""的含义。我个人遇到了string.empty的第一次,不得不花一些时间搜索谷歌,看看他们是否真的是完全相同的事情。
- 它是公共只读字符串字段,其值为""…为什么会改变?
- 你错过了@jason提出的观点。你怎么知道你第一次见到string.Empty是什么?你知道你第一次看到的是什么吗?
这个话题已经很老了,很长时间了,如果在其他地方提到过这种行为,请原谅。(并指给我答案)
我发现,如果使用string.Empty或双引号,编译器的行为会有所不同。如果不使用用string.empty或双引号初始化的字符串变量,则差异会显示出来。
如果使用string.Empty初始化,则编译器警告
1
| CS0219 - The variable 'x' is assigned but its value is never used |
在使用双引号初始化时,不会发出预期的消息。
此行为在以下链接的Connect文章中进行了说明:https://connect.microsoft.com/VisualStudio/Feedback/Details/799810/c-Warning-CS0219-Not-Reported-When-assign-non-constant-value
基本上,如果我做的对,他们希望允许程序员设置一个变量,函数的返回值用于调试,而不需要用警告消息打扰他,因此他们只在开销分配和字符串的情况下限制警告。空不是一个常量,而是一个字段。
- 我相信你是第一个提到的人。几个月前我读过这个问题,但不记得有什么不同,如果有人提到这个问题,我会记住的。
- 有趣。注意,编译器可以完全优化(删除)声明var unused ="literal";。它不会有副作用。另一方面,var unused = MyClass.Member;不能完全移除。这是因为读取Member可能会产生副作用。如果Member是带有get访问器的静态属性,则必须保留对getter的调用。但即使Member是一个静态字段,静态构造函数也可能会运行副作用。当然,这样做是不好的编码风格。但你需要一个假人来阅读Member。
我在控制台应用程序中使用以下方法执行了这个非常简单的测试:
1 2 3 4 5 6 7 8
| private static void CompareStringConstants()
{
string str1 ="";
string str2 = string.Empty;
string str3 = String.Empty;
Console.WriteLine(object.ReferenceEquals(str1, str2)); //prints True
Console.WriteLine(object.ReferenceEquals(str2, str3)); //prints True
} |
这清楚地表明,所有三个变量,即str1、str2和str3,虽然使用不同的语法初始化,但都指向内存中完全相同的字符串(零长度)对象。我在.NET 4.5控制台应用程序中执行了此测试。所以在内部,它们没有区别,归根结底,它们都是为了方便您作为程序员使用。String类的这种行为称为在.NET中插入字符串。埃里克·利珀特在这里有一个非常好的博客描述了这个概念。
以上任何一种。
有许多更好的事情要自言自语。比如树皮什么颜色最适合一棵树,我认为模糊的棕色带有杜尔塞特苔藓的味道。
我非常喜欢字符串。空的,除了其他原因,以确保您知道它是什么,并且您没有意外地删除内容,但主要是为了国际化。如果我看到一个用引号括起来的字符串,那么我总是想知道这是否是一个新的代码,它应该被放入一个字符串表中。因此,每当代码被更改/审阅时,您需要查找"引号中的某些内容",是的,您可以过滤掉空字符串,但我告诉人们,最好不要在引号中添加字符串,除非您知道它不会本地化。
没有人提到在VisualStudio中,字符串的颜色编码与字符串的颜色编码不同。这对可读性很重要。此外,小写通常用于var和type,不是大问题,而是字符串。empty是常量,不是var或type。
string是System.String型的同义词,它们是相同的。
值也相同:string.Empty == String.Empty ==""。
我不会在代码中使用字符常量"",而是使用string.Empty或string.Empty,更容易理解程序员的意思。
在string和string之间,我更喜欢小写的string,因为我在Delphi工作了很多年,Delphi样式是小写的string。
所以,如果我是你的老板,你会写信给string.Empty
我没什么区别。最后一个是打字最快的。)
它完全是一个代码样式的首选项,用于处理.NET如何处理字符串。但是,我的意见是:)
访问静态方法、属性和字段时,我总是使用bcl类型名称:string.Empty或Int32.TryParse(...)或Double.Epsilon。
在声明新实例时,我总是使用C关键字:int i = 0;或string foo ="bar";。
我很少使用未声明的字符串文本,因为我希望能够扫描代码,将它们组合成可重用的命名常量。无论如何,编译器都会用文本替换常量,所以这更像是一种避免使用魔术字符串/数字的方法,并用名称赋予它们更多意义。另外,更改值更容易。
我更喜欢string.Empty而不是string.Empty,因为您可以使用它而不需要在您的文件中包含using System;。
对于选择""而不是string.Empty,这是个人的偏好,应由您的团队决定。
- 我是团队中唯一的成员,我该如何决定?掷骰子?
- 对于那些想知道如何在不导入using System命名空间的情况下使用string.Empty常量的人来说,C中的关键字只需转换为包含命名空间的完全限定名,然后在输出*.dll或*.exe文件中写入msil。因此,编译器有效地将string.Empty写成msil中的System.String.Empty。正如您已经知道的那样,如果您提到完全限定的类型名,那么您可以跳过代码文件顶部的导入名称空间。
没关系,它们是完全一样的。但是,最重要的是你必须保持一致
另外,我一直在和这种"什么是正确的事情"斗争。
- 在现代世界中,"一致"意味着在全世界的所有团队中都是一致的,这是StackOverflow的目标之一。如果我可以建议,我们使用string.empty。
- 有些语言没有空常量,我能想到的所有语言都允许"零长度字符串"。所以我投票赞成""与其他语言的一致性。:)
我用第三个,但其他两个中第一个似乎不那么奇怪。字符串是字符串的别名,但在分配过程中看到它们会让人感觉不舒服。
我亲自目睹了""导致(小)问题两次。一次是由于一个新手对基于团队的编程的错误,另一次是一个简单的打字错误,但事实是使用了string.empty可以避免这两个问题。
是的,这在很大程度上是一种判断调用,但是当一种语言为您提供了多种方法来做事情时,我倾向于使用一种具有最多编译器监督和最强编译时强制的方法。这不是""。一切都是为了表达特定的意图。
如果您键入string.empty或strng.empty,编译器会让您知道您错了。立即。它只是无法编译。作为一个开发人员,您引用的是编译器(或其他开发人员)不能以任何方式曲解的特定意图,并且当您执行错误操作时,您不能创建bug。
如果您在"when you means"中键入"",或者反之亦然,编译器会很高兴地按照您的指示进行操作。另一个开发人员可能或可能无法了解您的特定意图。创建错误。
早在string.empty之前,我就用了一个标准库来定义空的字符串常量。在不允许使用string.empty的case语句中,仍然使用该常量。
只要有可能,让编译器为您工作,并消除人为错误的可能性,无论有多小。在我看来,这比其他人所说的"可读性"更重要。
特定性和编译时强制。这就是吃晚饭的原因。
前两个我都可以接受。我将避免最后一个错误,因为在引号之间加一个空格相对容易引入错误。通过观察很难发现这个特定的错误。假设没有错别字,所有的都在语义上是等价的。
[编辑]
另外,您可能希望始终使用string或string来保持一致性,但这只是我自己。
- 我同意这句话,但当我懒惰的时候,我仍然过着危险的生活。在任何情况下,我都不认为我有机会在变量声明之外为它赋值之前编写使用字符串的代码。事实上,尽管有风险,但我还是必须初始化字符串,这让我很恼火。
从长远来看,编译器应该使它们完全相同。选择一个标准,这样你的代码就容易阅读,并坚持下去。
我使用"",因为它将在我的代码中以独特的黄色显示…出于某种原因,在我的Visual Studio代码主题中,string.empty都是白色的。我相信这对我来说最重要。
我只是在看一些代码,这个问题突然出现在我的脑海里,我以前读过。这当然是一个可读性问题。
考虑下面的C代码…
1
| (customer == null) ?"" : customer.Name |
VS
1
| (customer == null) ? string.empty : customer.Name |
我个人认为后者不那么模棱两可,更容易阅读。
正如其他人所指出的,实际差异是可以忽略的。
空字符串就像空集合,只是每个人用来调用""的名称。在形式语言中,由长度为零的字母表创建的字符串称为空字符串。集合和字符串都有一个特殊的符号。空字符串:ε和空集合:?如果你想谈论这个零长度的字符串,你会称它为空字符串,这样每个人都能确切地知道你所指的是什么。现在,如果您将其命名为空字符串,那么为什么不在代码中使用string.Empty,它表明意图是明确的。缺点是它不是一个常量,因此不能像属性那样在任何地方都可用。(由于某些技术原因,它不是常量,请参阅参考源。)
我认为第二个是"合适的",但老实说,我认为这无关紧要。编译器应该足够聪明,能够将任何一个字节码编译成完全相同的字节码。我自己用。
在http://blogs.msdn.com/b/brada/archive/2003/04/22/49997.aspx上:
As David implies, there difference between String.Empty and "" are pretty small, but there is a difference. "" actually creates an object, it will likely be pulled out of the string intern pool, but still... while String.Empty creates no object... so if you are really looking for ultimately in memory efficiency, I suggest String.Empty. However, you should keep in mind the difference is so trival you will like never see it in your code...
As for System.String.Empty or string.Empty or String.Empty... my care level is low ;-)
- 2003年的那篇msdn博客文章……您确定这对于最新的.NET版本仍然是正确的吗?!
- @Carstensch&252;tte:在我看来,这样的功能并不会改变太多……如果是的话,互联网上有一些关于它的传言。
- @sergiol如果字段比文本更有效,那么这无疑是一个性能错误。所以希望现在能修好。
虽然差异非常非常小,但差异仍然存在。
1)""在string.empty不创建对象。但此对象将创建一次,如果代码中还有其他"",则稍后将从字符串池引用此对象。
2)字符串和字符串是相同的,但我建议使用string.empty(以及string.format、string.copy等),因为点符号表示类,而不是运算符,并且以大写字母开头的类符合C编码标准。