gpt4 book ai didi

c# - Static readonly vs const——不同的程序集 POV?

转载 作者:IT王子 更新时间:2023-10-29 04:51:56 26 4
gpt4 key购买 nike

关于这个主题有很多问题,但没有一个(one but still a short one 除外)处理以下场景。

来自 C# 4 书:

enter image description here

马克还写道:

if you change the value of a const, you need to rebuild all the clients

问题:

1) 为什么会这样? static readonlyconst 都是 static 吗?

2) 值实际保存在哪里?

3) 使一个字段static readonly实际上是如何解决这个“幕后”问题的?

最佳答案

不,const 是 const,不是 static - 它是一种特殊情况,具有不同的规则;它在编译时(而非运行时)设置,并且处理方式不同

这里的关键是下面的意思:

var foo = SomeType.StaticValue;

对比

var bar = SomeType.ConstValue;

第一种情况下,它在运行时从SomeType读取值,即通过ldsfld;然而,在第二种情况下,它被编译为,即如果 ConstValue 恰好是 123,那么第二个是 相同

var bar = 123;

在运行时,它来自 SomeType 的事实不存在,因为值 (123) 被计算编译器,并存储。因此,它需要重建以获取新的值(value)。

更改为 static readonly 意味着保留“从 SomeType 加载值”。

所以如下:

static int Foo()
{
return Test.Foo;
}
static int Bar()
{
return Test.Bar;
}
...
static class Test
{
public static readonly int Foo = 123;
public const int Bar = 456;
}

编译为:

.method private hidebysig static int32 Bar() cil managed
{
.maxstack 8
L_0000: ldc.i4 0x1c8
L_0005: ret
}

.method private hidebysig static int32 Foo() cil managed
{
.maxstack 8
L_0000: ldsfld int32 ConsoleApplication2.Test::Foo
L_0005: ret
}

请注意,在 Bar 中,ldc 正在加载一个值直接 (0x1c8 == 456),使用 Test 完全消失了。

为了完整起见,const 用静态字段实现的,但是 - 它是一个文字字段,意思是:在编译器中计算,而不是在运行时计算。 p>

.field public static literal int32 Bar = int32(0x1c8)
.field public static initonly int32 Foo

关于c# - Static readonly vs const——不同的程序集 POV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9109567/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com