치다:
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
시간 초과가 매우 명확하다는 것은 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; }
}
- 설정할 수 있습니까
Duration
IsTimeoutEnabled
true이면 0으로 ?
- 경우
IsTimeoutEnabled
거짓, 무엇을 내가 설정하면 어떻게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
여기에 가치가 없다는 아이디어를 잘 표현합니다. 제공되지 않습니다. 사용할 수 없습니다. 숫자도 아니고 0 / 빈 문자열도 아닙니다. 최대 값 또는 최소값으로 사용하지 마십시오.
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
유형에 대해서만 이야기하고 있습니다.