code

.ToString ()이 null 값이있는 nullable int에서 제대로 작동 할 때 null 문자열의 .ToString ()이 null 오류를 발생시키는 이유는 무엇입니까?

codestyles 2020. 11. 4. 08:00
반응형

.ToString ()이 null 값이있는 nullable int에서 제대로 작동 할 때 null 문자열의 .ToString ()이 null 오류를 발생시키는 이유는 무엇입니까?


selectedItem 두 개의 필드가 있습니다.

  • int? _cost
  • string _serialNumber

이 예에서 _cost_serialNumberof selectedItem는 모두 null입니다. selectedItem속성 통해 필드를 읽고 값으로 텍스트 상자를 채 웁니다.

TextBox1.Text = selectedItem.Cost.ToString(); //no error
TextBox2.Text = selectedItem.SerialNumber.ToString(); //error

SerialNumber.ToString()중복 되는 것은 이해하지만 (이미 문자열이기 때문에)이 예외가 발생하는 이유를 이해할 수 없습니다.

Nullable 개체에는 값이 있어야합니다.

  • int? _cost nullable이고 값이 없지만 예외가 발생하지 않습니다.
  • string _serialNumber널 (NULL)이며, 값이없는, 그러나 그것은 하지 나에게 예외를 제공합니다.

질문 은 그것에 대해 다루고 있습니다. 그 사람은 본질적으로 같은 것을 묻고 있지만 지정된 답변이 없으며 왜 nullable int? 예를 들어 .ToString()nullable int에는 사용할 수 있지만 null 문자열에는 사용할 수 없습니까?


string유형은 null실제로 아무 것도 가리 키지 않기 때문에 메모리에 객체가 없습니다.
그러나 int?값이 null여전히 일부 객체를 가리 키도록 설정된 경우에도 type (nullable) .
Jeffrey Richter의 "C #을 통한 CLR"을 읽으면 nullable 형식은 DB null을보다 편리하게 사용할 수 있도록 일부 캡슐화 된 논리를 사용하는 일반 형식의 파사드 클래스 일 뿐이라는 것을 알 수 있습니다.

nullable 형식에 대해 알아 보려면 msdn확인하세요 .


A Nullable<int>는 a struct이며 실제로는 null 일 수 없습니다. 따라서 "null"구조체에 대한 메서드 호출은 여전히 ​​작동합니다.

_cost == null유효한 표현식 을 만드는 "컴파일러 마법"이 있습니다.


int?실제로는 그 자체로 객체가 아니라 Nullable<int>객체입니다.

따라서 선언 할 때 int? _Cost실제로 선언하는 Nullable<int> _Cost것이며의 속성은 객체 자체 _Cost.Valueundefined아닙니다 _Cost.

실제로 사용하는 문법 설탕입니다 non nullable같은 종류의 int, bool또는 decimal쉽게.

MSDN 에 따르면 :

구문은 T?대한 속기 System.Nullable<T>여기서, Tvalue 타입이다. 두 형식은 서로 바꿔 사용할 수 있습니다.


문자열은 참조 유형이지만 nullable int는 값 유형입니다. 다음은 차이점에 대한 좋은 토론입니다 . http://www.albahari.com/valuevsreftypes.aspx .


Nullable은 실제로 HasValue와 Value라는 두 가지 속성을 노출하는 구조체입니다. 이렇게하면 오류가 발생합니다.

int? i = null;
i.Value.ToString()

int 여부를 확인하려면? 접근 할 수있는 가치가 있습니다.i.HasValue


내가 생각하는 이유는 컴파일러가 원시 데이터 유형을 만나면 해당 객체로 래핑한다는 것입니다. toString () 메서드 호출은 여기에서 간접 호출 (래핑 후 메서드 호출)이며 예외가 처리됩니다. String의 경우 메서드를 직접 호출합니다. null을 가리킬 때 메서드는 예외를 throw합니다.


그 이유는 간단합니다. int?또는 Nullable<int>A는 구조체 또는 값 유형이 , 그것은 null이 될 수 없다 .

그래서 우리가 할 때 일어나는 일 :

int? _cost = null;

_cost이 개 필드를해야합니다 Value그리고 HasValue우리가 할당 할 때, null_costHasValue설정됩니다 플래그 falseValue필드가 할당 될 default(T)경우 int?그 것 0.

우리가 전화를 이제 경우 ToString_cost, Nullable<T>의 재정의 정의가 ToString우리를 보면, 마이크로 소프트의 제공 자료 참조 다음과 같이 구현됩니다 :

public override string ToString() {
    return HasValue ? value.ToString() : "";
}

따라서이 _cost할당 되었으므로 빈 문자열을 반환합니다 null.

이제 string _serialNumber. string이하는 참조 형식이며 수 순수하게 유지 null. 보류 null중이면 호출 ToString하면 예상대로 Null 참조 예외가 생성됩니다.

다음을 볼 수 있습니다. 값 유형 및 참조 유형-MSDN


TextBox2.Text = selectedItem.SerialNumber.ToString(); //error

System.String의 멤버 인 ToString () 함수를 호출하기 때문에 yiels 오류가 발생합니다 . 이 함수는 System.String의이 인스턴스를 반환합니다. 실제 변환은 수행되지 않습니다. 또한 String은 참조 유형입니다. 참조 유형에는 데이터를 보유하는 다른 메모리 위치에 대한 포인터가 포함됩니다.

TextBox1.Text = selectedItem.Cost.ToString(); //no error

System.Integer 의 멤버 인 ToString () 함수를 호출하므로 오류가 발생하지 않습니다 . 이 함수는이 인스턴스의 숫자 값을 해당하는 문자열 표현으로 변환합니다. 또한 Integer는 값 유형입니다. 데이터 유형은 자체 메모리 할당 내에 데이터를 보유하는 경우 값 유형입니다.

동일한 함수 이름 ToString ()이지만 다른 작업을 수행합니다.

String.ToString 메서드

Int32.ToString 메서드

값 유형 및 참조 유형

참고 URL : https://stackoverflow.com/questions/11446838/why-does-tostring-on-a-null-string-cause-a-null-error-when-tostring-works

반응형