2013-10-03 67 views
3

我有一些類的方法實現科學,數值算法。哪些用於C#中的算法參數:static,const,readonly?

例如,一個類實現徑向基函數並需要一些參數。目前,他們是這樣的:

public class Interpolator { 

    // Free parameters 
    static int LAYERS = 6; 
    static int MINIMUM_NEIGHBORS = 1; 
    static double SEARCH_RADIUS = 20; 
    static double START_RADIUS = 100; 

    (...) 
} 

這裏的想法是,這些參數將通過實驗來確定,最好不要改變,甚至沒有通過配置。

所以問題是:哪個是「正確」的方式來聲明它們?他們是否應該是static?他們不應該是const?在C#中,這種(相當常見的)模式通常是如何針對良好實踐實施的?

感謝您的閱讀!

回答

8

這裏的想法是,這些參數將通過實驗來確定 ,最好不要改變,甚至通過 配置

不只是聲明爲常數。 const。由於常量是隱式靜態的,你可以用你的類名訪問它們。

如果您將它們定義爲靜態,那麼您也可以修改它們。

public class Interpolator 
{ 
    const int LAYERS = 6; 
    const int MINIMUM_NEIGHBORS = 1; 
    const double SEARCH_RADIUS = 20; 
    const double START_RADIUS = 100; 
} 
+0

非常有用的信息。但是這些變量是私有的,只能在這個類的方法中使用。 – heltonbiker

+0

@heltonbiker,如果他們是私人的,那麼他們不能在課堂外訪問,但仍然把它們作爲'const'將會使你免於意外修改任何這些變量。 – Habib

+0

不錯,這就是主意。即使這個項目完全在內部編程,您提到的這些意外(錯誤)修改可能隨時發生。謝謝! – heltonbiker

1

爲了給出一個簡潔實用的答案:

readonly:你曾經需要改變他們,他們一直在初始化之後?

static:他們應該可以從其他程序集訪問嗎?

const:如果您對前兩個問題的回答爲「否」,請使用const。

+0

這不是嚴格正確的。 'readonly static'與'const'不一樣。如果它是'readonly static',那麼它是一個可變的,並佔據內存中的一個位置。它也可以是一個非文字值,甚至可以在運行時生成(只要它在初始化後沒有改變)。 'const'意味着它是一個*編譯時間常量*,因爲它不會在內存中創建一個位置;在使用標識符的任何地方都會內聯字面值。 – Servy

1

爲了使用「的價值觀,不會改變」,你可以聲明字段或者conststatic readonly

public class Interpolator 
{ 
    // Free parameters 
    static readonly int LAYERS = 6; 
    const int MINIMUM_NEIGHBORS = 1; 
} 

要決定一個或另一個我用以下標準:

  • 如果只能在此程序集內訪問它(Visual Studio中的此項目),請使用const
  • 如果它可以被其他程序集訪問,請使用static readonly

提高你的例子:

public class Interpolator 
{ 
    // Free parameters 
    public static readonly int LAYERS = 6; 
    internal const int MINIMUM_NEIGHBORS = 1; // internal means public to this assembly but private to other assemblies. 
    private const double SEARCH_RADIUS = 20; 
} 

作出這樣的區分,爲什麼? 當編譯器在表達式中找到const字段時,它會將該字段替換爲其值,然後對其進行編譯。這非常有效。

int a = 5 * Interpolator.SEARCH_RADIUS; 

被編譯爲:

int a = 100; 

但是想象一下,你必須在文件(.dll)組件定義爲constInterpolator.SEARCH_RADIUS,並用它弗朗另一個文件(.exe)組裝。

public const double SEARCH_RADIUS = 20; 

如果在未來,你改變了定義

private const double SEARCH_RADIUS = 10; 

並重新編譯文件(.dll)組裝​​。如果您不重新編譯(.exe)程序集,它仍然會使用a==100,因爲SEARCH_RADIUS = 20是在.exe編譯過程中使用的值。

如果您已經定義

public static readonly double SEARCH_RADIUS = 20; 
在該.dll

,當你改變值10並重新編譯只有文件(.dll)進行組裝,其他文件(.exe),議會將自動獲得的變化,而不需要重新編譯。

+0

哇,這是一個非常相關的區別!,+1,謝謝! – heltonbiker