考慮してください:
1.言語
∞を使用すると、最大のソリューションになります。
C#にはint.MaxValue
がありますが、あなたのケースでは使用できません。int.MaxValue
最大整数である2,147,483,647です。コード内で、何かが爆発する前の最大許容圧力など、何かの最大値がある場合は、2,147,483,647を使用しても意味がありません。
2.フレームワーク
.NET Frameworkはこの点でかなり矛盾しており、マジック値の使用は批判される可能性があります。
たとえば"Hello".IndexOf("Z")
、マジック値を返します-1
。それは多分、それは(それをしない?)が容易になり、結果を操作します:
int position = "Hello".IndexOf("Z");
if (position > 0)
{
DoSomething(position);
}
カスタム構造を使用するのではなく:
SearchOccurrence occurrence = "Hello".IndexOf("Z");
if (occurrence.IsFound)
{
DoSomething(occurrence.StartOffset);
}
しかし、まったく直感的ではありません。なぜ-1
ありませんか-123
?初心者は、0
それが「見つからない」ことを意味している、または単にタイプミスしていると誤って考えるかもしれません(position >= 0)
。
3.コンテキスト
コードがネットワークソケットのタイムアウトに関連している場合、一貫性を保つために何十年もの間誰もが使用していたものを使用することは悪い考えではありません。特に、0
タイムアウトの場合は非常に明確です。これはゼロにできない値です。この場合にカスタムクラスを使用すると、物事を理解するのがより難しくなる場合があります。
class Timeout
{
// A value indicating whether there is a timeout.
public bool IsTimeoutEnabled { get; set; }
// The duration of the timeout, in milliseconds.
public int Duration { get; set; }
}
- trueの
Duration
場合、0 に設定できIsTimeoutEnabled
ますか?
IsTimeoutEnabled
falseの場合、Duration
100 に設定するとどうなりますか?
これは、複数の間違いにつながる可能性があります。次のコードを想像してください。
this.currentOperation.Timeout = new Timeout
{
// Set the timeout to 200 ms.; we don't want this operation to be longer than that.
Duration = 200,
};
this.currentOperation.Run();
操作は10秒間実行されます。Timeout
クラスのドキュメントを読むことなく、このコードの何が問題なのかわかりますか?
結論
null
値がここにないという考えをうまく表現しています。提供されていません。利用不可。それは数字でも、ゼロ/空の文字列でも何でもありません。最大値または最小値には使用しないでください。
int.MaxValue
言語自体に強く関連しています。クラスのint.MaxValue
最高速度制限Vehicle
や航空機の最高許容速度などには使用しないでください。
-1
コードのような魔法の値は避けてください。それらは誤解を招きやすく、コードの間違いにつながります。
最小値/最大値を指定して、より簡単な独自のクラスを作成します。たとえば、VehicleSpeed
を持つことができますVehicleSpeed.MaxValue
。
非常に特定の分野で何十年もの間一般的な慣習であり、この分野でコードを書いているほとんどの人が使用している場合、以前のガイドラインに従わずにマジック値を使用してください。
アプローチを混在させることを忘れないでください。例えば:
class DnsQuery
{
public const int NoTimeout = 0;
public int Timeout { get; set; }
}
this.query.Timeout = 0; // For people who are familiar with timeouts set to zero.
// or
this.query.Timeout = DnsQuery.NoTimeout; // For other people.
¹無限大を含む独自のタイプを作成できます。ここでは、ネイティブint
タイプのみについて説明しています。