为了账号安全,请及时绑定邮箱和手机立即绑定

为什么String.Empty不是常数?

/ 猿问

为什么String.Empty不是常数?

FFIVE 2019-09-21 15:48:02

在.Net中,为什么String.Empty只读而不是常量?我只是想知道是否有人知道该决定背后的原因。



查看完整描述

3 回答

?
墨色风雨

static readonly代替constMicrosoft 的原因是由于与非托管代码一起使用,如Microsoft在“ 共享源通用语言基础结构2.0版本”中所指示。要查看的文件是sscli20\clr\src\bcl\system\string.cs。


空常量保存空字符串值。我们需要调用String构造函数,以便编译器不会将其标记为文字。


将其标记为文字将意味着它不会显示为我们可以从本地访问的字段。


我在CodeProject的这篇便利文章中找到了此信息。


查看完整回答
反对 回复 2019-09-21
?
蝴蝶不菲

我认为这里有很多混乱和不良反应。


首先,const字段是static成员(不是实例成员)。


检查C#语言规范的10.4常量。


即使常量被认为是静态成员,常量声明也不需要也不允许使用静态修饰符。


如果public const成员是静态的,则不能认为常量会创建一个新的Object。


鉴于此,以下代码行在创建新Object方面的作用完全相同。


public static readonly string Empty = "";

public const string Empty = "";

这是Microsoft的注释,解释了2之间的区别:


readonly关键字与const关键字不同。const字段只能在该字段的声明中初始化。只读字段可以在声明中或在构造函数中初始化。因此,取决于使用的构造函数,只读字段可以具有不同的值。同样,虽然const字段是编译时常量,但readonly字段可用于运行时常量,...


因此,我发现唯一合理的答案是杰夫·耶茨(Jeff Yates)。


查看完整回答
反对 回复 2019-09-21
?
侃侃无极

String.Empty read only instead of a constant?

如果使任何字符串常量,则编译器将在调用它的任何地方都替换为实际的字符串,并用相同的字符串填充代码,并且在代码运行时还需要从不同的内存中一次又一次地读取该字符串数据。


如果将字符串仅保留在一个位置上,则String.Empty该程序仅将一个字符串保留在一个位置上并对其进行读取或引用,以使数据在内存中的存储量最小。


另外,如果您使用String.Empty作为const编译任何dll,并且由于任何原因更改了String.Empty,则编译后的dll将不再起作用,因为costmake内部代码实际上会保留字符串的副本在每个电话上。


例如,请参见以下代码:


public class OneName

{

    const string cConst = "constant string";

    static string cStatic = "static string";

    readonly string cReadOnly = "read only string";


    protected void Fun()

    {

        string cAddThemAll ;


        cAddThemAll = cConst;

        cAddThemAll = cStatic ;

        cAddThemAll = cReadOnly;    

    }

}

将由编译器提供为:


public class OneName

{

    // note that the const exist also here !

    private const string cConst = "constant string";

    private readonly string cReadOnly;

    private static string cStatic;


    static OneName()

    {

        cStatic = "static string";

    }


    public OneName()

    {

        this.cReadOnly = "read only string";

    }


    protected void Fun()

    {

        string cAddThemAll ;


        // look here, will replace the const string everywhere is finds it.

        cAddThemAll = "constant string";

        cAddThemAll = cStatic;

        // but the read only will only get it from "one place".

        cAddThemAll = this.cReadOnly;


    }

}

和大会电话


        cAddThemAll = cConst;

0000003e  mov         eax,dword ptr ds:[09379C0Ch] 

00000044  mov         dword ptr [ebp-44h],eax 

        cAddThemAll = cStatic ;

00000047  mov         eax,dword ptr ds:[094E8C44h] 

0000004c  mov         dword ptr [ebp-44h],eax 

        cAddThemAll = cReadOnly;

0000004f  mov         eax,dword ptr [ebp-3Ch] 

00000052  mov         eax,dword ptr [eax+0000017Ch] 

00000058  mov         dword ptr [ebp-44h],eax 


查看完整回答
反对 回复 2019-09-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信