2012-12-17 87 views
0

在線測試有這樣一個問題:讀的何時分配ReadOnly變量?

特點唯一的變量:

  1. 它是在
  2. 聲明與初始化分開
  3. 它在運行時被分配的編譯時間分配
  4. 所有這些

該測試給出了答案爲4.I g等2和3,但不知道1.請問這是時可能發生的1答案的例子:

private readonly int readonlyExample = 10; 

注:我通常會使用一個常量爲上面的例子中

+2

有趣的問題,但可供選擇的答案很差。 – vcsjones

+0

這不是一個很好的問題。 – Erix

+0

我同意。答案選擇不當。這個在線測試在哪裏?它是在編譯時分配的......但那只是因爲編譯器並沒有在整個代碼庫中將其替換......雖然有些令人困惑。 –

回答

0

這些可能的答案有點混亂(在我看來)。

什麼是實際發生的是C#編譯器實際發出這樣的事情:

private readonly int readOnlyExample; 

public YourClassConstructor() 
{ 
    this.readOnlyExample = 10; 
} 

鑑於此,#2似乎是一個可能的選擇。聲明和分配是分開的。 (他們甚至指什麼是爭奪)

3也可能是正確的,因爲值必須住在內存某處。這不是編譯時間常量。

+0

所以你說我的例子仍然在運行時分配,4的答案是錯的?如果是這樣,我會將其標記爲答案。 – Renae

0

建議的答案(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的前提條件)。

+0

嗨,是的,我明白這一點,你的例子涵蓋了答案2和3,但是當答案是4時,我問是否或什麼時候答案1可能發生。 – Renae

+0

@Renae:增加更多細節,試圖回答你的意見。 –

+0

感謝您的額外信息,但這仍然不能回答我的問題。答案意味着可以在編譯時和運行時分配只讀。你的例子證明2和3是真實的,但並不能確定地說1不是真的。我的例子可能是一個常量,是C#編譯器聰明,足以看到這一點,並把它像一個常量? vcsjones答案告訴我,它不是。 – Renae

1

如果您爲readonly變量賦值,那麼您是綁定變量,那麼這是編譯時間。例如:

readonlt int xyz=10; // then this is compile time 

如果您從任何將執行並返回值的函數賦值,那麼它將是運行時間。例如:

readonly int xyz=objClass.getSum(); // Then it is runtime.