【问题标题】:Why .NET Boolean has TrueLiteral and TrueString?为什么 .NET Boolean 有 TrueLiteral 和 TrueString?
【发布时间】:2010-04-06 10:53:12
【问题描述】:

为什么在布尔类型中有两个值相同的字段?

internal const int True = 1;
internal const int False = 0;
internal const string TrueLiteral = "True";
internal const string FalseLiteral = "False";

public static readonly string TrueString;
public static readonly string FalseString;

static Boolean()
{
    TrueString = "True";
    FalseString = "False";
}

在反射器生成的代码中,方法不使用这些字符串,但是:

public string ToString(IFormatProvider provider)
{
    if (!this)
    {
        return "False";
    }
    return "True";
}

使用这些 const 值不是更好吗?

编辑:在 CIL 中使用 const 字符串和实例字符串没有区别。

所以当我声明一个私有的 const string = "a" 时,在应用程序中使用 "a" 的任何地方,Jitter 都使用 const 值,还是只在 const string 的范围内?

【问题讨论】:

    标签: .net refactoring types boolean


    【解决方案1】:

    关于差异的简要概述 在 C# 中的 'const' 和 'readonly' 之间:

    常量:

    • 不能是静态的。
    • 在编译时评估值
    • 仅在声明时初始化。

    只读:

    • 可以是实例级或静态的。
    • 在运行时评估值
    • 可以在声明中初始化,也可以通过构造函数中的代码初始化。

    (source)

    因此,在您看到“False”硬编码的地方,它只是在编译时从 FalseLiteral const 替换。

    【讨论】:

    • 虽然大多数情况下是正确的,但说一个常量“不能是静态的”是不正确的,因为常量 (语法上)静态的(我说的是语法上,因为从来没有一个实际的静态运行时调用,因为它们是在编译时评估的)。确实不能显式声明 static 的常量,但这只是因为它是多余的并且可能会引起混淆。
    【解决方案2】:

    原因是,如果公共const 变量的值稍后更改,则可能会出现问题。由于它们的值在 CIL 中直接替换,因此您最终可能会得到两个程序集,它们对相同的 const 使用不同的值。为避免这种情况,该类型仅公开 readonly 变量(TrueStringFalseString)。

    在内部,没有问题:如果您更改代码中的const 值,无论如何您都会编译程序集。所以这就是internal consts(TrueLiteralFalseLiteral)的原因。这样,他们的组装可以利用他们更高的速度。

    由于const 变量在 CIL 中直接替换为它们的值,因此您无法在反射器生成的代码中看到它们。但它们确实在ToString内部使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 2017-06-10
      • 2019-12-18
      • 1970-01-01
      • 2018-08-16
      • 2012-06-25
      • 2015-11-29
      相关资源
      最近更新 更多