免責宣告:這個問題只是出于好奇,顯然永遠不要嘗試這樣做。
我知道常量不是變數。但是常量的值必須存盤在記憶體中的某個地方,對嗎?并且該記憶體位置有一個地址。所以一定有辦法得到那個地址,對吧?
像這樣的東西:
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# 中做到這一點?
uj5u.com熱心網友回復:
主要的答案是否定的,這是不可能的。那是因為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確實需要存盤 - a const string。然后你可以得到一個char*并修改字串
const string sv = "7";
Console.WriteLine(sv); // outputs 7
unsafe {
fixed (char* p = sv) {
*p = '8';
}
}
Console.WriteLine(sv); // outputs 8
正如你所指出的,這是一個非常糟糕的主意。
uj5u.com熱心網友回復:
編譯器用文字替換常量。在運行時,記憶體中唯一保存常量值的地方是一個變數,其值是從常量分配的。
順便說一句,編譯器也使用可以在編譯時從常量計算的值來執行此操作。這意味著您不會通過為其他常量的簡單算術運算定義常量來獲得任何效率。例如,定義一個常量HALF_PI和只寫Math.PI / 2無處不在之間沒有運行時區別。定義的原因HALF_PI是方便或可讀性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/344548.html
