2012-06-15 88 views
4

我的班級包含LOT_SIZE常數,不能更改。但是我只能在執行期間初始化它,因爲我在運行時從Securities表中獲取LOT_SIZE。不過,我想表明,這是恆定的,我希望保護它免受除了我想初始化它的一個「朋友」地方之外的任何其他地方的變化(「證券」表格閱讀)。如何聲明只能在運行時初始化的const

我們有東西在C#或我只需要使用LOT_SIZE作爲常規變量?

我不能申報LOT_SIZEreadonly因爲在對象建設期間「證券」表仍然沒有閱讀,所以我不知道LOT_SIZE值。

+2

[只讀(C#參考)(http://msdn.microsoft。 com/en-us/library/acdd6hb7(v = vs.100).aspx) - 在初始化課程之前,您不能閱讀證券表嗎? – jrummell

+1

你可以在一個類的內部定義一個** private **變量,然後只給一個屬性獲得訪問變量 – Steve

+0

LOT_SIZE是否只能是「朋友」地方的只讀成員?如果這是對價值負責的階級,那麼也許它應該生活在那裏。 – mafue

回答

3

最好的辦法可能是創建必須持有它在課前閱讀的價值,這樣你就可以把它傳遞到構造函數,並把它變成一個readonly場。但是,正如你已經排除這樣做的明顯的方式...

你可以使用一個只讀屬性(用GET,但沒有設置屬性),並總是通過屬性來訪問它除了在地方,你開始設定價值。

如果你甚至不想在你自己的班級中冒險改變它,那麼創建一個班來「包裝」這個值。這個類只會在第一次需要時讀取值,並將其作爲只讀屬性公開給消費者類。

但無論您選擇何種方式,請不要使用命名爲您不斷:-) 「1970年公司的C宏常量」(ALL_CAPS)

+1

我正在使用CAPS,因爲這是Java中的默認代碼樣式,僅在〜1995中創建:) http://www.cwu.edu/~gellenbe/javastyle/constant.html – javapowered

1

不能在一種方式,它可以在一個地方,而不是其他任何修改(除了您排除只讀)聲明一個變量。

我建議你使用某種「懶惰模式」。編寫一個包裝值的類,並允許將值精確設置一次。您可以使引用此類的實例的變量爲只讀。

class WriteOnce<T> 
{ 
T _val; 
bool _isInitialized; 

public T Value { 
    get { if (!_isInitialized) throw; return _val; } 
    set { if (_isInitialized) throw; _val = value; } 
} 
} 

... 

class SomeOtherClass { 
readonly WriteOnce<int> LOT_SIZE = new WriteOnce<int>(); 
} 
0

你可以做一個類從表一中的私有成員變量讀取(甚至使類辛格爾頓拿到尤伯杯花式)。然後只用一個getter創建一個靜態公共變量。這有點矯枉過正,但這將是允許在初始化後設置它的唯一方法,但只能修改一次。