Erwägen:
Sprache,
Rahmen,
Kontext.
1. Sprache
Die Verwendung von ∞ kann eine Lösung für ein Maximum sein.
In C # gibt es int.MaxValue
, aber Sie können es in Ihrem Fall nicht verwenden. int.MaxValue
ist die maximale Ganzzahl von 2.147.483.647. Wenn Sie in Ihrem Code einen Maximalwert von etwas haben, z. B. einen maximal akzeptierten Druck, bevor etwas explodiert, hat die Verwendung von 2.147.483.647 keinen Sinn.
2. Framework
.NET Framework ist in diesem Punkt eher inkonsistent und die Verwendung magischer Werte kann kritisiert werden.
Gibt beispielsweise "Hello".IndexOf("Z")
einen magischen Wert zurück -1
. Es macht es vielleicht einfacher (oder?), Das Ergebnis zu manipulieren:
int position = "Hello".IndexOf("Z");
if (position > 0)
{
DoSomething(position);
}
anstatt eine benutzerdefinierte Struktur zu verwenden:
SearchOccurrence occurrence = "Hello".IndexOf("Z");
if (occurrence.IsFound)
{
DoSomething(occurrence.StartOffset);
}
ist aber überhaupt nicht intuitiv. Warum -1
nicht -123
? Ein Anfänger kann auch fälschlicherweise denken, dass 0
dies auch "Nicht gefunden" bedeutet oder einfach nur "falsch" (position >= 0)
.
3. Kontext
Wenn Ihr Code mit Zeitüberschreitungen in Netzwerk-Sockets zusammenhängt, ist es keine schlechte Idee , etwas zu verwenden, das seit Jahrzehnten von allen verwendet wird, um konsistent zu sein . Insbesondere 0
für ein Timeout ist sehr klar: Es ist ein Wert, der nicht Null sein kann. In diesem Fall kann die Verwendung einer benutzerdefinierten Klasse das Verständnis erschweren:
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; }
}
- Kann ich
Duration
auf 0 setzen , wenn IsTimeoutEnabled
es wahr ist?
- Wenn
IsTimeoutEnabled
falsch, was passiert, wenn ich Duration
auf 100 setze ?
Dies kann zu mehreren Fehlern führen. Stellen Sie sich den folgenden Code vor:
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();
Der Vorgang dauert zehn Sekunden. Können Sie sehen, was mit diesem Code nicht stimmt, ohne die Dokumentation der Timeout
Klasse zu lesen ?
Fazit
null
drückt gut die Idee aus, dass der Wert nicht hier ist. Es ist nicht vorgesehen. Nicht verfügbar. Es ist weder eine Zahl noch eine Null oder eine leere Zeichenfolge. Verwenden Sie es nicht für maximale oder minimale Werte.
int.MaxValue
hängt stark mit der Sprache selbst zusammen. Nicht int.MaxValue
für eine maximale Geschwindigkeitsbegrenzung der Vehicle
Klasse oder eine maximal zulässige Geschwindigkeit für ein Flugzeug usw. verwenden.
Vermeiden Sie magische Werte wie -1
in Ihrem Code. Sie sind irreführend und führen zu Fehlern im Code.
Erstellen Sie Ihre eigene Klasse, die mit den angegebenen Minimal- / Maximalwerten einfacher zu handhaben ist. Zum Beispiel haben VehicleSpeed
kann VehicleSpeed.MaxValue
.
Befolgen Sie keine vorherigen Richtlinien und verwenden Sie magische Werte, wenn es sich um eine jahrzehntelange allgemeine Konvention in einem sehr speziellen Bereich handelt, die von den meisten Leuten verwendet wird, die Code in diesem Bereich schreiben.
Vergessen Sie nicht, Ansätze zu mischen. Beispielsweise:
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.
¹ Sie können Ihren eigenen Typ erstellen, der Unendlich enthält. Ich spreche hier nur von einheimischem int
Typ.