.ToString ()이 null 값이있는 nullable int에서 제대로 작동 할 때 null 문자열의 .ToString ()이 null 오류를 발생시키는 이유는 무엇입니까?
selectedItem
두 개의 필드가 있습니다.
int? _cost
string _serialNumber
이 예에서 _cost
및 _serialNumber
of 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.Value
가 undefined
아닙니다 _Cost
.
실제로 사용하는 문법 설탕입니다
non nullable
같은 종류의int
,bool
또는decimal
쉽게.
MSDN 에 따르면 :
구문은
T?
대한 속기System.Nullable<T>
여기서,T
value 타입이다. 두 형식은 서로 바꿔 사용할 수 있습니다.
문자열은 참조 유형이지만 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
로 _cost
그 HasValue
설정됩니다 플래그 false
와 Value
필드가 할당 될 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 ()이지만 다른 작업을 수행합니다.
'code' 카테고리의 다른 글
예외를 잡았습니다 !! (0) | 2020.11.04 |
---|---|
IIS Express를 사용하여 웹 사이트 호스팅 (임시) (0) | 2020.11.04 |
Python 데몬 및 systemd 서비스 (0) | 2020.11.04 |
GAITrackedViewController 및 UITableViewController (0) | 2020.11.04 |
Tensorflow 텐서 차원 (모양)을 정수 값으로 얻는 방법은 무엇입니까? (0) | 2020.11.04 |