Düşünmek:
1. Dil
∞ kullanmak azami bir çözüm olabilir.
C # 'da var int.MaxValue, ama senin durumunda kullanamazsın. int.MaxValuemaksimum tamsayı, 2,147,483,647'dir. Kodunuzda, bir şey patlamaya başlamadan önce maksimum bir baskı gibi, maksimum bir değere sahip olursanız, 2.147.483.647'yi kullanmanın bir anlamı yoktur.
2. Çerçeve
.NET Framework bu noktada oldukça tutarsız ve sihirli değerlerin kullanımı eleştirilebilir.
Örneğin, "Hello".IndexOf("Z")bir sihirli değer döndürür -1. Bu belki de (bunu yapar?) Kolaylaştırır sonucu işlemek için:
int position = "Hello".IndexOf("Z");
if (position > 0)
{
DoSomething(position);
}
özel bir yapı kullanmak yerine:
SearchOccurrence occurrence = "Hello".IndexOf("Z");
if (occurrence.IsFound)
{
DoSomething(occurrence.StartOffset);
}
ama hiç sezgisel değil. Neden -1ve değil -123? Yeni başlayanlar ayrıca yanlışlıkla 0"Bulunamadı" anlamına da gelebilir ya da sadece yanlış yazım yapabilir (position >= 0).
3. Bağlam
Kodunuz ağ soketlerinde zaman aşımları ile ilgiliyse, tutarlı olma uğruna herkes tarafından on yıllarca kullanılan bir şeyin kullanılması kötü bir fikir değildir . Özellikle, 0bir zaman aşımı için çok açık: sıfır olamaz bir değer. Bu durumda özel bir sınıf kullanmak işlerin anlaşılmasını zorlaştırabilir:
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; }
}
- Doğru
Durationise 0 olarak ayarlayabilir miyim IsTimeoutEnabled?
- Eğer
IsTimeoutEnabledyanlış ise Duration100'e set edersem ne olur ?
Bu birden fazla hataya yol açabilir. Aşağıdaki kod parçasını hayal edin:
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();
İşlem on saniye boyunca devam eder. TimeoutSınıfın dökümanlarını okumadan bu kodda neyin yanlış olduğunu görebiliyor musunuz?
Sonuç
nullDeğerin burada olmadığı fikrini iyi ifade eder. Sağlanmadı. Müsait değil. Ne sayı, ne de sıfır / boş dize veya hiç. Maksimum veya minimum değerler için kullanmayın.
int.MaxValuedilin kendisi ile yakından ilgilidir. Kullanmayın int.MaxValuemaksimum hız limiti için Vehiclebir uçağın, vs. sınıf veya maksimum kabul edilebilir bir hızda
-1Kodunuzdaki gibi sihirli değerlerden kaçının . Yanıltıcılar ve kodlarda hatalara yol açarlar.
Belirlenen minimum / maksimum değerlerle, daha basit bir şekilde kendi sınıfınızı oluşturun. Örneğin VehicleSpeedolabilir VehicleSpeed.MaxValue.
Daha önce herhangi bir kılavuza uymayın ve çoğu insan tarafından bu alana kod yazarken kullanılan, çok özel bir alanda yıllarca süren genel bir kuralsa, sihirli değerleri kullanmayın.
Yaklaşımları karıştırmayı unutma. Örneğin:
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.
İnity Sonsuzluğu içeren kendi türünüzü oluşturabilirsiniz. Burada intyalnızca yerel türden bahsediyorum .