VB.NET에서 nullable 형식으로 만들면 구조체의 멤버를 볼 수없는 이유는 무엇입니까?nullable로 선언 된 구조체의 멤버를 볼 수 없습니다.
예 :
if(myNullableInstance.hasValue)
myNullableInstance.value.myNullVar=1
VB.NET에서 nullable 형식으로 만들면 구조체의 멤버를 볼 수없는 이유는 무엇입니까?nullable로 선언 된 구조체의 멤버를 볼 수 없습니다.
예 :
if(myNullableInstance.hasValue)
myNullableInstance.value.myNullVar=1
, 당신은 이 값을 가져 오도록 Value
속성을 사용해야합니다. 그러나 System.Nullable<T>
은 변경 불가능합니다. Value
속성은 읽기 전용입니다. 값의 복사본을 반환 할 것이므로, 이 일 수 있더라도 필드를 변경하면 원하는대로 처리되지 않습니다.
실제로 이것은 좋은 것입니다. 값 유형 은이어야합니다. 가변 구조체는 끔찍합니다. Nullable<T>
이 유형을 사용하기 어렵게 만드는 경우 불변의 경로를 무너 뜨리는 것은 좋습니다.
필드를 읽기 전용으로 만들고 값을 전달할 수있는 생성자를 추가하십시오. 그런 다음 nullable 값을 수정하는 대신 완전히 새로운 값을 변수에 할당하십시오.
때문에 : 유형이 널 때 당신이 존재하는 경우에만 그 값에 접근, 값이 있는지 확인한다로되어있다
Public Structure myNullable
Dim myNullVar As Integer
End Structure
Sub Main()
Dim myInstance As myNullable 'This works.
Dim myNullableInstance? As myNullable 'This works.
myInstance.myNullVar = 1 'This works.
myNullableInstance.myNullVar = 1 'This doesn't work.
End Sub
시도 할 때이 오류가 발생합니다. "식은 값이므로 배정의 대상이 될 수 없습니다." – Pliskin
다른 답변에서 언급 한 것처럼, .Value를 사용하여 nullable의 내부 값에 액세스 할 수 있습니다. 하지만 그들은 당신이 myNullableInstance.Value.myNullVar = 1을하는 것이 좋습니다.
구조가 작동하기 때문입니다. 구조체의 멤버를 변경하면 새로운 struct 인스턴스가 만들어집니다. Value가 ReadOnly이므로 Nullable 클래스의 Value 속성을 직접 수정 할 수 없으므로이 작업을 수행 할 수 없습니다.
하지만 이것은 작동합니다 : 기본적으로
myNullableInstance.Value.myNullVar = 1
, 당신은에 의해 반환 된 구조의 일부 사본에 할당 될 것이다 :
는Dim myInstance as myNullable
myInstance.myNullVar = 1
myNullableInstance = myInstance
이것이 이 작동하지 않습니다 의미가 있습니다 Value 속성
일반적으로 구조가 불변으로 이루어 지므로 실제로는 문제가되지 않습니다.을 사용하는 것이 좋습니다. 어떤 과제를 앞뒤로 처리하면 문제를 해결할 수 있지만 다른 사람들이 게시 할 때 클래스를 사용하여 다시 생각해야합니다. 그렇게하면 null 참조를 사용할 수 있기 때문에 Nullable도 필요하지 않습니다.
nullable structres는 고통이며 Microsoft가 어려운 일을해서는 안될 충분한 이유가 없습니다. 이 방법은 언어 사용자가 아닌 컴파일러 작성자가 쉽게 사용할 수 있도록합니다.
실제로 참조 유형과 값 유형이 다르게 동작해야하는 이유가 없습니다.Microsoft는 논리적 인 포인터 (주소)를 숨기려고하지만, 작업이 더 어렵지 않기 때문에 잘 작동하지 않습니다. 언어에 부과 된 모든 규칙 및 제한 사항으로 인해 상황이 더욱 어려워지고 비효율, 런타임 오류 및 높은 개발 비용이 발생합니다.
논리적으로 입력 된 포인터로 돌아 가면 더 나아질 것입니다. 그러면 우리는 불변의 단어처럼 멋진 단어를 필요로하지 않을 것입니다. (불변의 의미는 변경 불가능합니다!)
내 제안은 Nullable 구조를 버리고 항상 nullable 인 클래스로 만드는 것입니다.
구조체가 필요한 것은 무엇입니까? 나는 대부분의 .net 프로그램을위한 구조, 특히 사람들을 배우는 데별로 사용하지 않는다. NET – Maslow
Dim myNullVar에서 작동하지 않는 것은 무엇인가? 'Integer?' 수업에 싸여 있니? 또는이 구조체가 모두 포함 된 경우 전달할 값으로 사용합니다. – Maslow