문제

나는 이 개념이 .net 2.0에 도입된 이후로 이에 대한 좋은 지침을 찾고 있었습니다.

C#에서 null을 허용하지 않는 데이터 형식을 사용하려는 이유는 무엇입니까?(더 나은 질문은 기본적으로 null 허용 유형을 선택하지 않고 명시적으로 타당한 경우에만 null 허용이 아닌 유형을 사용하는 이유입니다.)

Null을 허용하지 않는 피어 대신 Null을 허용하는 데이터 유형을 선택하면 '상당한' 성능 저하가 있습니까?

나는 Guid.empty, string.empty, DateTime.MinValue,<= 0 등 대신 null에 대해 내 값을 확인하고 일반적으로 null 허용 유형으로 작업하는 것을 선호합니다.그리고 내가 무효가 가능한 유형을 더 자주 선택하지 않는 유일한 이유는 머리 뒤쪽의 가려운 느낌이 엑스트라 '를 강제하는 거꾸로 호환성보다 더 큰 느낌이 들기 때문입니까?' 명시 적으로 널 값을 허용하는 문자.

항상(거의 항상) null을 허용하지 않는 유형 대신 null 허용 유형을 선택하는 사람이 있습니까?

시간 내 줘서 고마워,

도움이 되었습니까?

해결책

당신이 항상 nullable 유형을 사용해서는 안되는 이유는 때로는 그 가치를 보장 할 수 있기 때문입니다. ~ 할 것이다 초기화됩니다. 그리고 가능한 한 자주 발생하도록 코드를 설계하려고 노력해야합니다. 값을 초기화 할 수있는 방법이 없다면 NULL이 법적 가치가되어야하는 이유가 없습니다. 매우 간단한 예로, 이것을 고려하십시오.

List<int> list = new List<int>()
int c = list.Count;

이것은 언제나 유효한. 가능한 방법은 없습니다 c 초기화되지 않을 수 있습니다. 그것이 바로 바뀌면 int?, 당신은 독자들에게 코드를 효과적으로 알리게됩니다. "이 값은 null 일 수 있습니다. 사용하기 전에 확인하십시오". 그러나 우리는 이것이 결코 일어날 수 없다는 것을 알고 있으므로 왜 코드 에이 보증을 노출시키지 않겠습니까?

값이 선택 사항 인 경우에는 절대적으로 옳습니다. 문자열을 반환하거나 반환 할 수있는 함수가 있으면 NULL을 반환하십시오. string.empty ()를 반환하지 마십시오. "마법 가치"를 반환하지 마십시오.

그러나 모든 값이 선택 사항은 아닙니다. 그리고 모든 것을 선택적으로 만들면 나머지 코드를 훨씬 더 복잡하게 만듭니다 (처리해야 할 또 다른 코드 경로가 추가됩니다).

이 값이 항상 유효하다는 것을 구체적으로 보장 할 수 있다면 왜이 정보를 버리나요? 그것이 당신이 무효가 가능한 유형으로 만들어서하는 일입니다. 이제 값이 존재하거나 존재하지 않을 수도 있고 값을 사용하는 사람은 두 경우를 모두 처리해야합니다. 그러나 당신은 처음에 이러한 사례 중 하나만 가능하다는 것을 알고 있습니다. 코드 사용자에게 호의를 베풀고이 사실을 코드에 반영합니다. 코드의 모든 사용자는 유효한 값에 의존 할 수 있으며 두 가지가 아닌 단일 케이스 만 처리하면됩니다.

다른 팁

nullable 유형이 항상 있는지 확인 해야하는 것은 불편하기 때문에 null.

분명히 값이 진정으로 선택 사항 인 상황이 있으며, 그러한 경우 마법 숫자 등이 아닌 무효 유형을 사용하는 것이 합리적이지만 가능한 경우 피하려고 노력할 것입니다.

// nice and simple, this will always work
int a = myInt;

// compiler won't let you do this
int b = myNullableInt;

// compiler allows these, but causes runtime error if myNullableInt is null
int c = (int)myNullableInt;
int d = myNullableInt.Value;    

// instead you need to do something like these, cumbersome and less readable
int e = myNullableInt ?? defaultValue;
int f = myNullableInt.HasValue ? myNullableInt : GetValueFromSomewhere();

언어 디자이너는 '기본적으로 참조 유형이 무효화 될 수 없다'고 생각하며, 무효화가 아닌 유일한 기본값이 아니며, 무효를 선택해야한다고 생각합니다. (이것은 많은 현대 기능 언어로 된 방법입니다.) "null"은 일반적으로 많은 문제가 있습니다.

두 가지 질문이있는 것 같습니다 ...

C#에서 널리 사용되지 않는 데이터 유형을 사용하고 싶은 이유는 무엇입니까?

간단합니다. 의존하는 값 유형 데이터는 컴파일러가 실제로 값을 갖도록 보장하기 때문에 간단합니다!

기본적으로 무효 유형을 선택하지 않으며 명시 적으로 의미가있을 때는 무효화 할 수없는 유형 만 사용하지 않겠습니까?

Joel이 이미 언급했듯이, 유형은 참조 유형 인 경우에만 무일하게 될 수 있습니다. 컴파일러는 값을 보장합니다. 프로그램이 값을 갖는 변수에 의존하는 경우, 이것은 무효 유형을 선택하지 않음으로써 원하는 동작입니다.

물론, 데이터가 프로그램이 아닌 곳에서 나오면 모든 베팅이 꺼져 있습니다. 가장 좋은 예는 데이터베이스에서 나온 것입니다. 데이터베이스 필드가 될 수 있습니다 null, 당신은 당신의 프로그램 변수 가이 값을 모방하기를 원할 것입니다 - 단지 "마법"값 (예 : -1, 0 또는 무엇이든) 만 나타내는 것이 아니라 "대표하는"것입니다. null. 당신은 귀중한 유형으로 이것을합니다.

null 값은 "아직 초기화되지 않음" 또는 "지정되지 않음" 값으로 사용하기에 편리할 수 있지만 주로 다음의 의미를 오버로드하기 때문에 코드를 더 복잡하게 만듭니다. null 변수(숫자 또는 null 대그냥 숫자).

NULL 값은 많은 데이터베이스 디자이너와 SQL 데이터베이스 프로그래머가 선호하지만 문제에 대한 생각을 조금만 바꾸면 Null 값을 없애고 실제로 더 간단하고 안정적인 코드를 가질 수 있습니다(예: 걱정할 필요 없음). NullReferenceException에스).

실제로 "T!"에 대한 많은 수요가 있습니다. "t?"와 비슷한 참조 유형을 불가능하게 만드는 연산자. 가치 유형을 무효화 할 수 있고, C#의 발명가 인 Anders Hejlsberg는 그가 능력을 포함시키기를 바랐습니다.

질문도 참조하세요. C# 및 Java에 "null"이 존재하는 이유는 무엇입니까?

나는 그들이 이해할 수있는 곳마다 무효 유형을 사용하는 경향이 있습니다. 문제가 될 때까지 성능에 신경 쓰지 않을 것입니다. 그러면 몇 가지 영역을 수정하고 수행해야합니다.

그러나 나는 또한 일반적으로 내 가치의 대부분이 무효화가 불가능하다는 것을 알았습니다. 사실, 실제로는 참조 유형과 함께 사용할 수있는 것을 실제로 원한다는 것을 여러 번 좋아하여 널을 얻을 때 널 문제에 대해 알 수 있습니다.

무효 유형을 사용해야하는 유일한 시간은 데이터베이스 테이블의 특정 필드가 어느 시점에서 응용 프로그램에 의해 널을 보내거나 받도록 요구하는 경우입니다. 그러한 경우에도 항상 무효 유형을 사용하는 방법을 찾으려고 노력해야합니다. Bool은 항상 당신의 가장 친한 친구는 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top