在線測試有這樣一個問題:讀的何時分配ReadOnly變量?
特點唯一的變量:
- 它是在
- 聲明與初始化分開
- 它在運行時被分配的編譯時間分配
- 所有這些
該測試給出了答案爲4.I g等2和3,但不知道1.請問這是時可能發生的1答案的例子:
private readonly int readonlyExample = 10;
注:我通常會使用一個常量爲上面的例子中
在線測試有這樣一個問題:讀的何時分配ReadOnly變量?
特點唯一的變量:
該測試給出了答案爲4.I g等2和3,但不知道1.請問這是時可能發生的1答案的例子:
private readonly int readonlyExample = 10;
注:我通常會使用一個常量爲上面的例子中
這些可能的答案有點混亂(在我看來)。
什麼是實際發生的是C#編譯器實際發出這樣的事情:
private readonly int readOnlyExample;
public YourClassConstructor()
{
this.readOnlyExample = 10;
}
鑑於此,#2似乎是一個可能的選擇。聲明和分配是分開的。 (他們甚至指什麼是爭奪)
3也可能是正確的,因爲值必須住在內存某處。這不是編譯時間常量。
所以你說我的例子仍然在運行時分配,4的答案是錯的?如果是這樣,我會將其標記爲答案。 – Renae
建議的答案(4)不正確。 因爲,選項1)不正確!
只讀字段不必是編譯時間值。 考慮下面的代碼,即使分配給只讀字段的值不是編譯時間已知值,它也能很好地編譯!
public class ValidatingReadonlyField
{
private readonly UnKnownClass _readonlyField = new UnKnownClass();
}
public class UnKnownClass
{
private object _someValue;
public UnKnownClass()
{
_someValue = GetMeSomeThing();
}
private static object GetMeSomeThing()
{
throw new InvalidOperationException("Can you call me at Compile Time!!!");
}
}
編輯:更新爲每@Renae評論:
@Renae:回答1是不正確的!因爲上面的例子解釋了在編譯時分配只讀變量而不是的情況。因此,否定語句1. 如果您想進一步否定,請嘗試用「const」替換readonly,編譯會告訴您它只能有編譯時間值(這不是readonly的前提條件)。
如果您爲readonly變量賦值,那麼您是綁定變量,那麼這是編譯時間。例如:
readonlt int xyz=10; // then this is compile time
如果您從任何將執行並返回值的函數賦值,那麼它將是運行時間。例如:
readonly int xyz=objClass.getSum(); // Then it is runtime.
有趣的問題,但可供選擇的答案很差。 – vcsjones
這不是一個很好的問題。 – Erix
我同意。答案選擇不當。這個在線測試在哪裏?它是在編譯時分配的......但那只是因爲編譯器並沒有在整個代碼庫中將其替換......雖然有些令人困惑。 –