programing

문자열 유형의 기본값이 빈 문자열이 아닌 null인 이유는 무엇입니까?

starjava 2023. 10. 19. 21:49
반응형

문자열 유형의 기본값이 빈 문자열이 아닌 null인 이유는 무엇입니까?

내 모든 조건을 시험하는 것은 꽤 귀찮은 일입니다.null내가 안전하게 이런 방법을 적용하기 전에ToUpper(),StartWith()등..

기본값인 경우string빈 문자열이라면 테스트할 필요가 없을 것이고 다른 값 유형과 더 일치한다고 느낄 것입니다.int아니면double예를들면.또한.Nullable<String>말이 됩니다.

그렇다면 왜 C#의 디자이너들은null문자열의 기본값으로 사용할 수 있습니까?

참고: 이 질문은 이 질문과 관련된 것이지만, 이 질문을 어떻게 처리할 것인지 보다는 그 이유에 더 초점이 맞추어져 있습니다.

문자열 유형의 기본값이 빈 문자열이 아닌 null인 이유는 무엇입니까?

왜냐면string기준 유형이며 모든 기준 유형의 기본값은null.

ToUpper(), StartWith() 등의 메서드를 안전하게 적용하기 전에 모든 문자열을 null로 테스트하는 것은 상당히 귀찮습니다.

이는 참조 유형의 동작과 일치합니다.인스턴스 구성원을 호출하기 전에 null 참조를 위한 체크를 입력해야 합니다.

문자열의 기본값이 빈 문자열이라면 테스트할 필요가 없을 것이며, 예를 들어 int나 double과 같은 다른 값 유형과 더 일치한다고 생각합니다.

다른 특정 참조 유형에 기본값 할당null일관성이 없게 만들 겁니다

으로 .Nullable<String>말이 됩니다.

Nullable<T> 값 유형과 함께 작동합니다.주목할 사실은Nullable원본에 소개되지 않았습니다.그래서 그들이 그 규칙을 바꿨다면 많은 깨진 코드가 있었을 것입니다.(정례 @jcolebrand)

하비브 말이 맞아요 왜냐하면string는 참조 유형입니다.

하지만 더 중요한 것은, 당신이 확인할 필요가 없다는 것입니다.null사용할 때마다.당신은 아마도 던져야 할 것입니다.ArgumentNullException만약 누군가가 당신의 기능을 통과한다면 a.null참고할 수 있습니다.

이것이 문제입니다. 그 틀은 우리가 할 수 있는 일구어낼 것입니다.NullReferenceException어쨌든 당신이 전화를 하려고 했다면.ToUpper()끈으로이 사건은 당신이 당신의 주장을 시험하더라도 여전히 발생할 수 있다는 것을 기억하세요.null매개 변수로서 당신의 기능에 전달된 객체들에 대한 어떤 속성이나 방법이 평가될 수 있기 때문에null.

즉, 빈 문자열이나 널을 확인하는 것은 일반적인 일이기 때문에 이를 위해 제공합니다.

확장 방법(가치가 있는 경우)을 작성할 수 있습니다.

public static string EmptyNull(this string str)
{
    return str ?? "";
}

이제 안전하게 작동합니다.

string str = null;
string upper = str.EmptyNull().ToUpper();

C# 6.0 기준으로 다음을 사용할 수도 있습니다.

string myString = null;
string result = myString?.ToUpper();

문자열 결과가 null이 됩니다.

빈 문자열과 null은 기본적으로 다릅니다.null은 값이 없는 것이고 빈 문자열은 비어 있는 값입니다.

이 경우 빈 문자열인 변수의 "값"에 대한 가정을 하는 프로그래밍 언어는 null 참조 문제를 일으키지 않는 다른 값으로 문자열을 초기화하는 것과 같습니다.

또한 해당 문자열 변수의 핸들을 응용 프로그램의 다른 부분으로 전달하면 해당 코드는 빈 값을 의도적으로 전달했는지 또는 해당 변수의 값을 채우는 것을 잊어버렸는지 확인할 방법이 없습니다.

이것이 문제가 될 수 있는 또 다른 경우는 문자열이 어떤 함수의 반환 값일 때입니다.문자열은 참조 유형이며 기술적으로 null과 empty 양쪽의 값을 가질 수 있기 때문에 함수는 기술적으로 null 또는 empty를 반환할 수도 있습니다(그렇게 하는 것을 막을 수 있는 것은 없습니다).이제 "값의 부재"라는 두 가지 개념, 즉 빈 문자열과 null이 있기 때문에 이 함수를 소비하는 모든 코드는 두 가지 검사를 수행해야 합니다.하나는 비어 있고 다른 하나는 null입니다.

간단히 말해, 단일 상태에 대해 하나의 대표만 갖는 것은 항상 좋습니다.빈 값과 null에 대한 자세한 내용은 아래 링크를 참조하십시오.

https://softwareengineering.stackexchange.com/questions/32578/sql-empty-string-vs-null-value

사용자 입력을 처리할 때 NULL vs Empty

는 ( 작용하는 구성원들이 /는(가)를 할 수 입니다.net과 상호 작용하는 방법을 정의하는) CLS 사양의 설계자들이 클래스 구성원들이 다음을 통해서가 아니라 직접 호출되어야 한다고 지정할 수 있는 수단을 정의하지 않았기 때문입니다.callvirt, 호출자가 null-reference 체크를 수행하지 않고, 또한 "정상" 복싱의 대상이 되지 않는 구조를 정의하는 수단을 제공하지 않았습니다.

CLS 규격이 그러한 수단을 정의했다면 .net이 Common Object Model(COM)에 의해 설정된 리드를 일관되게 따르는 것이 가능할 것이며, 여기에서 널 문자열 참조는 의미론적으로 빈 문자열과 동등한 것으로 간주됩니다.기본값을 정의하기 위한 값 의미론을 갖는 것으로 추정되는 다른 사용자 정의 불변 클래스 유형에 대해서도 마찬가지입니다.기본적으로, 각 구성원들에게 무슨 일이 일어날 것인가는String를 들어, .Length비슷한 것으로 쓰이다[InvokableOnNull()] int String Length { get { if (this==null) return 0; else return _Length;} }이 방식은 매우 해야 합니다 이 접근 방식은 값처럼 행동해야 하는 것들에 대해 매우 좋은 의미론을 제공했을 것이지만 구현 문제 때문에 힙에 저장해야 합니다.이 접근법의 가장 큰 어려움은 그러한 유형과 유형 간의 변환의 의미론입니다.Object약간 탁해질 수도 있습니다.

다른 접근 방식은 다음에서 상속되지 않은 특수 구조 유형의 정의를 허용하는 것이었습니다.Object대신에 맞춤형 복싱 및 언복싱 작업을 수행했습니다(다른 클래스 유형으로 변환/전환됨).그러한 접근법 하에서는 클래스 유형이 존재할 것입니다.NullableString문자열이 지금 하는 것처럼 동작하고 사용자 지정 상자 구조 유형.String, 하나의 사적인 영역을 차지할 수 있는Value활자의String하는 중입니다.String.NullableString아니면Object돌아올 것입니다Valuenull이 아닌 경우 또는String.Empty무효인 경우에는캐스팅 시도 중String, 에 대한 null이 아닌 언급.NullableString인스턴스(instance)는 참조를 저장합니다.Value(길이가 0인 경우 null을 저장할 수 있음). 다른 참조를 캐스팅하면 예외가 발생합니다.

문자열을 힙에 저장해야 하지만 기본값이 아닌 값 유형처럼 동작하지 않아야 할 이유는 개념적으로 없습니다.참조를 가지는 "정상" 구조로 저장되도록 하는 것이 유형 "스트링"으로 사용하는 코드에서는 효율적이었지만, "오브젝트"에 캐스팅할 때 간접 및 비효율성 층을 추가로 추가했습니다.저는 최근에 .net이 위의 두 기능을 추가할 것으로 예상하지는 않지만, 아마도 향후 프레임워크 설계자들이 이 기능을 포함하는 것을 고려할 수 있을 것입니다.

C#의 설계자들이 문자열의 기본값으로 null을 사용한 이유는 무엇입니까?

문자열은 참조 유형이므로 참조 유형은 기본값입니다.null 참조 유형 변수는 실제 데이터에 대한 참조를 저장합니다.

이 경우 키워드를 사용해 보겠습니다.

string str = default(string); 

strstring, 참조 유형이므로 기본값은null.

int str = (default)(int);

str입니다.int, 값 유형이므로 기본값은zero.

문자열 변수는 인스턴스가 아닌 참조이기 때문입니다.

기본적으로 Empty로 초기화하는 것이 가능했겠지만 전반적으로 많은 불일치를 초래했을 것입니다.

아마 당신이 사용한다면??연산자가 문자열 변수를 할당할 때 도움이 될 수 있습니다.

string str = SomeMethodThatReturnsaString() ?? "";
// if SomeMethodThatReturnsaString() returns a null value, "" is assigned to str.

기본값인 경우string만약 빈 문자열이라면 테스트할 필요가 없을 것입니다.

틀렸습니다! 기본값을 변경해도 참조 유형이라는 사실이 변경되지 않고 누군가가 참조를 다음과 같이 명시적으로 설정할 수 있습니다.null.

으로 .Nullable<String>말이 됩니다.

요점은.허락하지 않는 것이 더 합리적일 것입니다.null모든 참조 유형에 대해 대신 요구합니다.Nullable<TheRefType>그 점에 대해서는.

그렇다면 왜 C#의 디자이너들은null문자열의 기본값으로 사용할 수 있습니까?

다른 참조 유형과의 일치성.자, 왜 허락을 하십니까?null참고 유형으로 볼 수가 없어요? C처럼입니다도 입니다. 비록 이것이 언어를 제공하는 의문의 디자인 결정이기는 하지만 말입니다.Nullable.

문자열은 불변의 개체로, 값이 주어졌을 때 이전 값이 기억에서 지워지지 않고 이전 위치에 남아 새로운 값이 새로운 위치에 놓이는 것을 의미합니다.그래서 만약 기본값이String a이었다String.Empty, 그것은 그것을 낭비할 것입니다.String.Empty첫 번째 값이 주어졌을 때 메모리의 블록.

아주 작아 보이지만 기본값이 다음인 문자열 배열을 초기화할 때 문제가 될 수 있습니다.String.Empty. 물론, 당신은 항상 변태성 물질을 사용할 수 있습니다.StringBuilder이것이 문제가 될 것 같으면 수업.

문자열은 참조 유형이고 참조 유형의 기본값은 null입니다.

말씀하신 이후로ToUpper(), 이 쓰레드를 찾은 방법은 이 쓰레드입니다. 이 바로가기(string ?? ")를 공유하겠습니다.상단()에 연결:

    private string _city;
    public string City
    {
        get
        {
            return (this._city ?? "").ToUpper();
        }
        set
        {
            this._city = value;
        }
    }

다음보다 나은 것 같습니다.

        if(null != this._city)
        { this._city = this._city.ToUpper(); }

일 도 요.string키워드는 다른 값 유형의 선언과 똑같이 보이기 때문에 당신을 혼란스럽게 했습니다. 그러나 그것은 실제로 에 대한 별칭입니다.System.String본 문제에서 설명한 바와 같이
또한 Visual Studio의 짙은 파란색과 소문자 첫 글자는 그것이 a라고 오해하게 할 수 있습니다.struct.

nullable type이 2.0까지 들어오지 않았습니다.

nullable 형식이 언어의 시작 부분에서 만들어졌더라면 string은 null이 아니고 string?은 null이 되었을 것입니다.하지만 그들은 하위 호환성 때문에 이것을 할 수 없었습니다.

많은 사람들이 ref-type, not ref-type을 이야기하지만, string은 일반적인 수업에서 벗어난 것이고 그것을 가능하게 하는 해결책이 발견되었을 것입니다.

언급URL : https://stackoverflow.com/questions/14337551/why-is-the-default-value-of-the-string-type-null-instead-of-an-empty-string

반응형