2014-06-21 67 views
3

[CallerLineNumber]是一個偉大的語言功能。但我用它來automatically order class properties as their declaration order。但是,當用戶使用此參數調用函數或構造函數時,用戶能夠向其提供值,這完全超過了自動生成的目的。目前,我必須命名這個參數,如_doNotSet,作爲提示調用者不設置此參數。如何使用[CallerLineNumber]強制參數爲只讀?

我該如何強制它只能讀取,或者甚至更好地將它從函數簽名中隱藏起來?

我想的另一個想法是將參數標記爲[Obsolete],所以通過使用它,編譯器會發出警告。不幸的是,ObsoleteAttribute不是針對參數,所以我不能標記參數。

+0

這可能是一個問題,如果它實際上與「用戶」相關,但實際上這個分鐘問題只與潛在的編碼人員有關,而且文檔評論無法處理。 – TyCobb

+2

這會揹負編譯器對可選參數的支持,這是一個讓編譯器生成值的硬性要求。沒有可能的語法讓你快樂,不缺乏///選項來教育用戶。 –

回答

2

我很驚訝,編譯器不會覆蓋調用函數傳入的值。無論如何,接受這種不幸的行爲,我不認爲會有任何事情可以做保證沒有人會打破這一點。

據我所知,最接近的是你所做的。將其命名爲_doNotSet,但我會建議類似_settingThisBreaksTheTool的東西。根據代碼的受衆,這可能足以滿足您的需求。

編輯:這個link顯示瞭如何確定是否提供了一個值,不幸的是沒有提供的策略會爲你工作。基本上他們建議使用一個已知不太可能的值(在你的情況下不可能,因爲你不知道行號或者你不會在意)。或不要使用默認值並重載該函數。但[CallerLineNumber]屬性需要該參數是可選工作。開溜。

來吧微軟...爲什麼

該進入的.Net如何實現可選參數的默認值。當你指定一個參數對一個函數是可選的,並且沒有值時調用該函數,在編譯過程中會發生一些特別的事情。代碼不是有一個值,該參數被替換爲確實有一個值,即默認值的代碼。

我之前讀過幾篇博文,this是最基本的理解。

我可能會在這裏做一些跳轉,但我的猜測是[CallerLineNumber]屬性指示編譯器使用不同的值,即行號。 但是編譯器甚至不會通過該過程來注入值,因爲首先存在值。

很可能微軟希望[CallerLineNumber]覆蓋傳入函數的值,但捎帶默認值的副作用可能導致它們無法支持該值。我會很有興趣看看Roslyn項目是否帶來了該功能的一些增強功能。