.NET/BCL源代码中注释“string.Empty”的混淆含义?我试图理解为什么string.Empty是只读的而不是常量。我看过这篇文章,但我不明白微软对此发表的评论。正如JonSkeet在评论中所写:“我不知道-老实说,这对我来说没有多大意义......”共享源通用语言基础设施2.0发布。string.cs位于sscli20clrsrcbclsystemstring.cs//Empty常量保存空字符串值。//我们需要调用String构造函数,这样编译器就不会将其标记为文字。//将其标记为文字意味着它不会显示为我们可以从本机访问的字段。publicstaticreadonlyStringEmpty="";我在这里没有看到任何String构造函数调用,而且它被标记为文本-“”有人可以用纯文本解释我吗,注释是什么意思,为什么它是string.Emptyreadonly而不是const?更新:EricLippert现在评论了一个已删除的答案:我在午餐时间问过一位C#老人,他没有具体回忆为什么做出这个决定,但推测它与实习相关。重要的部分不是在这个类中发生了什么,而是当另一个类使用(并链接到)它时会发生什么。让我用另一个例子来解释:假设你有一个包含类声明publicstaticconstintSOME_ERROR_CODE=0x10;的Assembly1.dll;publicstaticreadonlyintSOME_OTHER_ERROR_CODE=0x20;和另一个使用此publicintTryFoo(){try{foo();}catch(InvalidParameterException){returnSOME_ERROR_CODE;}catch(Exception){returnSOME_OTHER_ERROR_CODE;}return0x00;的例子您将该类编译成Assembly2.dll并将其链接到Assembly1.dll,正如预期的那样,您的方法将在无效参数时返回0x10,在其他错误时返回0x20,在成功时返回0x00。特别是,如果您创建包含interrorcode=TryFoo();之类的内容的Assembly3.exe如果(错误代码==SOME_ERROR_CODE)栏();否则如果(错误代码==SOME_OTHER_ERROR_CODE)baz();它将按预期工作(在与Assembly1.dll和Assembly2.dll链接后)现在,如果您获得新版本的Assembly1.dll,则有publicconstintSOME_ERROR_CODE=0x11;公共只读intSOME_OTHER_ERROR_CODE=0x21;如果您重新编译Assembly3.exe并将最后一个片段链接到新的Assembly1.dll和未更改的Assembly2.dll,它将按预期停止工作:bar()将不会被正确调用:Assembly2.dll将记住LITERAL0x20,即与Theliteral0x21readbyAssembly1.dll中的Assembly3.exe不同,将正确调用baz():Assembly2.dll和Assembly3.exe都引用名为SOME_OTHER_ERROR_CODE的符号引用,它由当前版本的Assembly1解析.dll在这两种情况下,所以在这两种情况下都在0x21中。简而言之:const创建一个LITERAL,readonly创建一个SYMBOLREFERENCE。LITERALS是框架内部的,不能被编组,因此它们可以被本机代码使用。所以publicstaticreadonlyStringEmpty="";创建符号引用(通过调用Stringcosntuctor以在首次使用时重新调整),可编组并因此可从本机使用,而publicstaticconstStringEmpty="";会创建一个文字,但不能。以上就是C#学习教程:混淆.NET/BCL源码中注解“string.Empty”的含义?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
