我可以得到一个 pointer/reference 到一个常量吗? C#

Can I get a pointer/reference to a constant? C#

免责声明:这个问题只是出于好奇,显然不应该尝试这样做。

我明白常量不是变量。但是常量的值必须存储在内存中的某个地方,对吧?那个内存位置有一个地址。所以一定有办法得到那个地址,对吧?

像这样:

const int seven = 7;

void Test()
{
    Console.Write(seven);//7
    int* pointerToSeven = GetThePointerOfConstSeven();//here we get the pointer to the constant
    Increment(pointerToSeven);
    Console.Write(seven);//8
}



void Increment(int* value)
{
    (*value)++;
}

忽略这是一件愚蠢的事情,有没有办法在 C# 中做到这一点?

编译器用文字替换常量。在运行时,内存中保存常量值的唯一位置是一个变量,其值是从常量分配的。

顺便说一句,编译器还使用可以在编译时从常量计算的值来执行此操作。这意味着您不会通过为其他常量上的简单算术运算定义常量来获得任何效率。例如,定义常量 HALF_PI 和到处写 Math.PI / 2 之间没有运行时差异。定义 HALF_PI 的原因是方便或可读性。

主要答案是否定的,这是不可能的。这是因为 7 不必存储在任何地方的(数据)内存中 - 它只是在 IL 和机器代码中直接作为数字引用。

考虑:

const int seven = 7;
Console.WriteLine(seven);

产生IL:

IL_0000 ldc.i4.7    
IL_0001 call Console.WriteLine (Int32)

变成机器码:

L0006   mov [rsp+0x20], rax
L000b   mov ecx, 7
L0010   call    System.Console.WriteLine(Int32)

如您所见,const int seven 在代码中变成了文字 7

但是,一种 const 确实需要存储 - const string。然后就可以得到一个char*,修改字符串

const string sv = "7";

Console.WriteLine(sv); // outputs 7

unsafe {
    fixed (char* p = sv) {
        *p = '8';
    }
}

Console.WriteLine(sv); // outputs 8

如您所述,这是一个非常糟糕的主意