はを使用する必要があります。readonly
をここに入力してください。 const
は実際にとなるものにはのように変更する必要があります(πなど)。これは、const
とreadonly
の微妙な違いが原因です。
主な問題は、そうでなければ、shoot yourself in the foot, badlyことができ、あなたがconst
の値を変更した場合、あなたはconst
使うすべて依存型クライアントを再コンパイルする必要があるということです。値がの場合はに変更されますので、const
を使用しないでください。readonly
を使用してください。だから、
、値ががちょうどconst
を使用して、ちょうど言う、ROUND
の面でEpsilon
の定義については心配しないで、変更するつもりはありませんである場合:
internal const int ROUND = 3;
public const double Epsilon = 1e-3;
あなたが本当にしたい場合あなたが誤って他のを変更せずに1を変更しないことを確認、あなたは、コンストラクタで、小さなチェックを追加することができます。
if (Epsilon != Math.Pow(10, -ROUND)) {
throw new YouForgotToChangeBothConstVariablesException();
}
あなたも、条件付きコンパイルを追加することができますデバッグリリースでのみコンパイルされます。
それはがstatic readonly
を使用し、変更するつもりの場合:
この制限付き
internal readonly int ROUND = 3;
public static readonly double Epsilon = Math.Pow(10, -ROUND);
私はconstsとして両方interdependant定数を定義することができる方法を参照してくださいません。 [...]私はこれを行う方法の明白な方法がないのですか?
いいえ、あなたはROUND
とEpsilon
の間で行くことMath.Pow
やMath.Log
を使って数学のいくつかの種類を行う必要があり、それらはconst
とコンパイル時の使用のために許容されません。は、単一の入力値に基づいてこれらの2行のコードを吐き出すための小型コードジェネレータを記述していますが、実際にはその時間を投資する価値について疑問を呈しています。
リテラルエラーとはなんですか? – rae1
あなたは実際には 'Epsilon'のための数学をしていて、0.001の値を作りません。 –
'readonly'フィールドを使用すると何が問題になりますか? – xxbbcc