Рассмотреть возможность:
Язык,
Фреймворк,
Контекст.
1. Язык
Использование ∞ может быть решением для максимума.
JavaScript, например, имеет бесконечность. C # не ¹
Ада, например, имеет диапазоны. C # нет.
В 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; }
}
- Могу ли я установить
Duration0, если IsTimeoutEnabledэто правда?
- Если
IsTimeoutEnabledfalse, что произойдет, если я установлю 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();
Операция длится десять секунд. Можете ли вы увидеть, что не так с этим кодом, не читая документацию 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типе.