[C#] 기본 문자열 초기화 : NULL 또는 비어 있습니까? [닫은]

NULL은 항상 값이 없음을 의미하고 “”또는 String.Empty는 유효한 값이라는 생각으로 문자열을 NULL로 초기화했습니다. String.Empty가 기본값으로 간주되거나 값을 나타내지 않는 코드의 최근 예를 더 많이 보았습니다. c #에 새로 추가 된 nullable 유형으로 인해 ‘No Value’를 나타 내기 위해 NULL을 사용하지 않고 문자열을 거꾸로 돌파하는 것처럼 보입니다.

기본 이니셜 라이저로 무엇을 사용하고 왜 사용합니까?

편집 : 답변을 기반으로 더 이상의 내 생각을 더

  1. 오류 처리 피하기 값이 null이 아니어야하는 이유는 NULL무엇입니까? 아마도 나머지 코드베이스를 통해 오류를 처리하는 대신 오류가 발생한 위치에서 오류를 식별하는 것이 더 낫습니까?

  2. null 검사 피하기 코드에서 null 검사에 지친 경우 null 검사를 추상화하는 것이 좋지 않습니까? 아마도 문자열 메서드를 NULL안전하게 감싸 줄 수 있습니까? 끊임없이 사용 String.Empty하고 시스템에 제대로 작동하지 않으면 NULL어떻게됩니까? 어쨌든 검사를 추가하기 시작 합니까?

나는 게으름에 대한 의견으로 돌아갈 수는 없습니다. DBA는 null데이터베이스 대신 ”를 사용하면 바보 같은 9 가지 방법을 사용할 수 있습니다. 나는 같은 원칙이 프로그래밍에 적용된다고 생각하고 가치를 나타내지 않고 String.Empty오히려 머리를 쓰는 사람들을 때려야 할 사람이 있어야한다 NULL.

관련 질문



답변

“빈”과 NULL을 구별하기 위해 +1. “빈”은 “유효하지만 공백”을 의미하고 “NULL”은 “유효하지 않음”을 의미한다는 데 동의합니다.

그래서 나는 당신의 질문에 다음과 같이 대답 할 것입니다 :

예를 들어 사용자의 중간 이름과 같이 변경되거나 변경되지 않을 수있는 유효한 기본값을 원하면 비어 있습니다.

다음 코드에서 명시 적으로 값을 설정하지 않은 경우 오류가 발생하면 NULL 입니다.


답변

MSDN 에 따르면 :

Empty대신 값으로 문자열을 초기화 null하면 NullReferenceException발생 가능성을 줄일 수 있습니다 .

IsNullOrEmpty()그럼에도 불구하고 항상 사용하는 것이 좋습니다.


답변

왜 문자열을 초기화하고 싶습니까? 변수를 선언 할 때 변수를 초기화 할 필요가 없으며 IMO는 할당하는 값이 코드 블록의 컨텍스트에서 유효한 경우에만 수행해야합니다.

나는 이것을 많이 본다.

string name = null; // or String.Empty
if (condition)
{
  name = "foo";
}
else
{
  name = "bar";
}

return name;

null로 초기화하지 않는 것만 큼 효과적입니다. 또한 가장 자주 값을 지정하려고합니다. null로 초기화하면 값을 할당하지 않은 코드 경로를 놓칠 수 있습니다. 이렇게 :

string name = null; // or String.Empty
if (condition)
{
  name = "foo";
}
else if (othercondition)
{
  name = "bar";
}

return name; //returns null when condition and othercondition are false

null로 초기화하지 않으면 컴파일러에서 모든 코드 경로에 값이 ​​할당되지 않았다는 오류가 발생합니다. 물론 이것은 매우 간단한 예입니다 …

마티즈


답변

실제로 문자열 처리 소프트웨어가 아닌 대부분의 소프트웨어의 경우 프로그램 논리는 문자열 변수의 내용에 의존하지 않아야합니다. 프로그램에서 이와 같은 것을 볼 때마다 :

if (s == "value")

기분이 나쁩니다. 이 방법에 왜 문자열 리터럴이 있습니까? 설정은 무엇입니까 s? 논리가 문자열 값에 의존한다는 것을 알고 있습니까? 작동하려면 소문자 여야한다는 것을 알고 있습니까? 이것을 사용하도록 변경하여 수정해야합니까 String.Compare? 나는 그것을 만들고 Enum파싱해야합니까?

이러한 관점에서 볼 때, 매우 간단한 코드 철학에 도달 할 수 있습니다. 가능하면 문자열 내용을 검사하지 않아도됩니다. 문자열을 비교하는 String.Empty것은 실제로 문자열 과 문자를 비교하는 특별한 경우입니다. 실제로하지 않으면하지 않는 것이 좋습니다.

이것을 알면 코드베이스에서 이와 같은 것을 볼 때 깜박이지 않습니다.

string msg = Validate(item);
if (msg != null)
{
   DisplayErrorMessage(msg);
   return;
}

우리는 그보다 더 나은 코드를 작성하기 때문에 Validate결코 반환하지 않을 것이라는 것을 알고 String.Empty있습니다.

물론 세계의 나머지 부분은 이와 같이 작동하지 않습니다. 프로그램이 사용자 입력, 데이터베이스, 파일 등을 다룰 때 다른 철학을 고려해야합니다. 혼란에 질서를 부과하는 것은 코드의 일입니다. 그 순서의 일부는 빈 문자열이 String.Empty언제 의미해야 하고 언제 의미 해야하는지 알고 null있습니다.

(내 엉덩이에서 말하지 않았는지 확인하기 위해 코드 문자열에서`String.IsNullOrEmpty ‘를 검색했습니다. 54 개의 모든 항목은 사용자 입력을 처리하고 Python 스크립트에서 값을 반환하며 검색된 값을 검사하는 메소드에 있습니다. 외부 API 등)


답변

이것은 실제로 C # 언어의 간극입니다. 널이 될 수없는 문자열을 정의 할 방법이 없습니다. 이것은 당신이 묘사하는 것만 큼 간단한 문제를 일으켜 프로그래머는 NULL과 String.Empty가 같은 것을 의미하기 때문에 의사가 결정할 필요가없는 결정을 내립니다. 결과적으로 나중에 다른 프로그래머가 NULL과 String.Empty를 모두 처리해야 할 수 있습니다.

더 큰 문제는 데이터베이스에서 C # 문자열에 매핑되는 필드를 정의 할 수 있지만 데이터베이스 필드는 NOT NULL로 정의 될 수 있다는 것입니다. 따라서 C # 형식을 사용하여 SQL Server에서 varchar (100) NOT NULL 필드를 정확하게 나타내는 방법은 없습니다.

사양 번호와 같은 다른 언어에서도이를 허용합니다.

제 생각에는 C #에서 null을 허용하지 않는 문자열을 정의 할 수 없다는 점은 이전에 null을 허용하는 int를 정의 할 수 없었던 것만 큼 나쁩니다.

귀하의 질문에 완전히 대답하기 위해 : 기본 초기화에는 항상 빈 문자열을 사용합니다. 데이터베이스 데이터 유형의 작동 방식과 더 유사하기 때문입니다. (편집 :이 문장은 매우 불분명했습니다. NULL이 불필요한 상태 일 때 기본 초기화에 빈 문자열을 사용합니다. NULL이 불필요한 상태이면 데이터베이스 열을 NOT NULL로 설정하는 것과 같은 방식입니다. , 많은 DB 열이 NOT NULL로 설정되어 있으므로 C # 문자열로 가져올 때 문자열이 비어 있거나 값이 있지만 결코 NULL이 아닙니다. 즉, 문자열을 NULL로만 초기화합니다. null이 String.Empty의 의미와는 다른 의미를 가지고 있고, 그 경우가 일반적인 경우보다 적다는 것을 알 수 있습니다 (그러나 여기 사람들은이 경우의 정당한 예를 제시했습니다). “)


답변

때에 따라 다르지.

값이 누락되었는지 알 수 있어야합니까 (정의되지 않을 수 있습니까)?

빈 문자열이 해당 문자열 사용법에 유효한 값입니까?

둘 다 “예”라고 대답 한 경우 null을 사용하고 싶을 것입니다. 그렇지 않으면 “값 없음”과 “빈 문자열”의 차이점을 알 수 없습니다.

값이 없는지 알 필요가없는 경우 빈 문자열은 사용하는 곳마다 널 검사를 건너 뛸 수 있으므로 더 안전합니다.


답변

이것이 http://en.wikipedia.org/wiki/Null_Object_pattern 의 특별한 경우 인 것 같습니다 .