2011-10-13 69 views
14

可以使用這樣的類(設計/指南特定)嗎?我正在使用MVVM模式。公共const字符串?

public static class Pages 
{ 
    public const string Home = "Home.xaml"; 
    public const string View2 = "View2.xaml"; 
    /* a few more... */ 
} 
+2

對於公開的可見性,我寧願把'static readonly'改爲'const',因爲那樣你就可以在不需要重新編譯的情況下改變這個值。 – mgronber

+3

@mgronber:這取決於上下文。在我開發的大多數情況下,如果更改一個程序集,則最終會在使用新版本之前重新編譯該程序集的客戶端。 –

回答

24

constpublic static readonly之間顯著的差別,你應該考慮其中小心使用:在不同的

(通過「客戶端」在這裏,我的意思是「代碼裝配指成員。)

  • 如果更改了值,但不重新編譯的客戶,如果你使用const他們仍然使用原來的價值。隨着public static readonly,他們將看到更新後的值。如果重新編譯所有客戶任何方式,這不是問題。
  • 只有const形式是一個編譯時間常數,這意味着它可以用在:
    • 屬性參數
    • switch語句
    • 可選參數聲明

如果」很高興重新編譯所有的客戶,如果你改變了價值,第二個項目符號點的好處是使用const

當然,我不知道Pages真的是否需要是公共反正...聽起來有點像這可能是internal,與internal成員 - 此時的const的缺點完全消失。

2

使用const定義常數值時的一般準則。這些常量是否要在程序集外部訪問?如果沒有,那麼它聲明爲

internal static class Pages 
{ 
    public const string Home = "Home.xaml"; 
    public const string View2 = "View2.xaml"; 
    /* a few more... */ 
} 
+0

在給出「使用靜態只讀而不是const」的通用建議之前,肯定值得理解利弊。考慮一下如果組件X發生變化,所有客戶端都將被重建 - 這是業務中相當常見的上下文。這是否改變了你的建議? –

+0

@JonSkeet這不是你必須使用只讀的東西!我已經回答了一個問題。我並不認爲在這種情況下公開課是必要的,所以我建議使用內部課程。另外,我認爲了解const和readonly的工作方式非常有用,因此,項目的鏈接。無論如何,我應該同意你在這裏提出的建議。 :-) – AksharRoop

+2

那麼,你基本上說:「如果它需要公開,請使用公共靜態只讀。」如果有人在閱讀本網站時沒有發現有效的C#,那麼即使它應該公開,實際上它不適用的建議也不會立即得到啓發。 –

2

從您的問題的設計角度來看,它似乎可以使用單個靜態對象快速混亂以包含所有頁面引用。你不能把它存儲在實際的頁面對象中嗎?

class view2 { 
    public const string PageName = "View2.xaml"; 

    ... other stuff ... 
} 

然後調用它的線沿線的...

goTo(view2.PageName); 
0

我覺得這是你能做的最好的事情之一。 一些更多的建議:使用字符串,使用const s是完全正確的。如果您想使用不同類型,請使用static readonly,然後在static構造函數中進行初始化。請參閱this thread。因爲你想要做的事情看起來很像一個字符串枚舉,這可能是你的方式。

不要忘記,只要您在代碼中指定頁面,進行更改(例如重命名或移動頁面)將會很痛苦。考慮使用資源或站點地圖等。 (如果你使用類的頁列表,我會使用C#的強類型資源去 - 他們的行爲以同樣的方式爲你的類,你不會有他們的代碼)

相關問題