2016-02-05 56 views
2

我需要在循環中使用兩個1.414 ...的平方根。如何在不輸入數字的情況下定義數學常量?

顯然,我不想一直調用函數Math.Sqrt(2)。當然,這是對現代處理器的單一指令,JIT或編譯器可能會弄清楚發生了什麼,但我希望我的代碼清晰,可讀且快速。

因爲我希望我的代碼清晰易讀,所以我寧願通過調用sqrt2 = Math.Sqrt(2)來定義此常量,而不是輸入幻數sqrt2 = 1.4142135623731d

最後,因爲這個值是一個常數,我想用const關鍵字聲明它。但是,當我寫:

const double sqrt2 = Math.Sqrt(2); 
// const double sqrt2 = 1.4142135623731d; 

編譯器會抱怨:

錯誤1的表達被分配到 'SQRT2' 必須是恆定的

我最好如何定義這個價值?

+2

你從那*代碼中得到*那*編譯器錯誤? –

+2

嗯,這裏有點不對勁。該代碼不應該生成編譯器錯誤。雙文字是允許的,它們顯然是不變的。 –

+1

強相關:[如何強制運行時常量爲編譯時間常量?](http://stackoverflow.com/questions/21501470/how-to-force-a-runtime-constant-to-bea-a-編譯時常量) –

回答

9

Math.Sqrt是一個方法調用,所以不能被分配到一個編譯時間不變。
你只能把它分配給一個運行時間常數

static readonly double sqrt2 = Math.Sqrt(2); 
+0

我一直在努力'const'和'static readonly'之間的區別,我只是簡單地停止使用'static readonly'。這就說得通了! – kvermeer

6

你可以嘗試使用static readonly,而不是const

static readonly double sqrt2 = Math.Sqrt(2); 

要明白,當你聲明一個常量時,它必須是編譯時間常量。

C# spec說:

常量表達式是可以在 編譯時完全求值的表達式。

1

在C#中,常量初始值設定項必須是編譯常量,因爲它們在編譯過程中作爲文字嵌入代替使用。這意味着標記爲const的成員的每個用法將在編譯期間替換爲其值,而只讀成員將在運行時解析。您可以改用static readonly

1

我看不出有什麼理由不應該將它初始化爲常量。

在我看來,如果你使用一個命名常量爲一個數字,那麼這個數字是而不是的一個幻數。

您可以創建一個MathematicalConstants類認爲,和其他值:

public static class MathematicalConstants 
{ 
    public const double SQRT2 = 1.4142135623731d; 
    public const double SQRT3 = 1.7320508075689d; 
} 

然後,如果你正在使用C#6或更高版本,你可以把

using static MathematicalConstants; 

在開始你的代碼模塊,你不需要把它稱爲MathematicalConstants.SQRT2。你可以只使用SQRT2在代碼:

const double sin45 = 1/SQRT2; 
const double tan30 = 1/SQRT3; 

順便說一下,有一個爲把常量靜態類的先例。 Math類具有PIE作爲常量,並且它們直接在源代碼中初始化。

相關問題