2009-08-11 3 views
3

VB.NET에서 nullable 형식으로 만들면 구조체의 멤버를 볼 수없는 이유는 무엇입니까?nullable로 선언 된 구조체의 멤버를 볼 수 없습니다.

예 :

if(myNullableInstance.hasValue) 
myNullableInstance.value.myNullVar=1 
+0

구조체가 필요한 것은 무엇입니까? 나는 대부분의 .net 프로그램을위한 구조, 특히 사람들을 배우는 데별로 사용하지 않는다. NET – Maslow

+0

Dim myNullVar에서 작동하지 않는 것은 무엇인가? 'Integer?' 수업에 싸여 있니? 또는이 구조체가 모두 포함 된 경우 전달할 값으로 사용합니다. – Maslow

답변

3

, 당신은 값을 가져 오도록 Value 속성을 사용해야합니다. 그러나 System.Nullable<T>은 변경 불가능합니다. Value 속성은 읽기 전용입니다. 값의 복사본을 반환 할 것이므로, 일 수 있더라도 필드를 변경하면 원하는대로 처리되지 않습니다.

실제로 이것은 좋은 것입니다. 값 유형 이어야합니다. 가변 구조체는 끔찍합니다. Nullable<T>이 유형을 사용하기 어렵게 만드는 경우 불변의 경로를 무너 뜨리는 것은 좋습니다.

필드를 읽기 전용으로 만들고 값을 전달할 수있는 생성자를 추가하십시오. 그런 다음 nullable 값을 수정하는 대신 완전히 새로운 값을 변수에 할당하십시오.

+0

아편 형 구조체 문제, 구조체가 마음에 들지 않는 또 다른 이유. – Maslow

+1

구조체를 작성하는 경우는 거의 없지만 문제는 실제로 * 변경할 수있는 구조체와 같습니다. –

+0

나는 변화 할 수있는 구조체를 전에 물었고, 무슨 일이 일어나고 있는지 전혀 몰랐던 이래로 나는 단어 구조를 클래스로 바꿨다. 갑자기 모든 코드가 작동했습니다. 그래서 나는 구조체 시도를 포기했다. – Maslow

-1

Nullable<T> 구조는 기본 값을 Value 속성을 통해 노출합니다. 따라서, 다음이 필요합니다 다른 사람이 말했다

myNullableInstance.Value.myNullVar = 1 
+0

시도 할 때이 오류가 발생합니다. "식은 값이므로 배정의 대상이 될 수 없습니다." – Pliskin

+0

네, 구조에 대한 지식이 객체 지향으로 바뀐 이후 거의 존재하지 않는 것 같습니다. 기본 질문에 대한 내 질문에 대한 답변 – Maslow

+0

풍자를 사랑하십시오. – Pliskin

0

때문에 : 유형이 널 때 당신이 존재하는 경우에만 그 값에 접근, 값이 있는지 확인한다로되어있다

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 
+0

시도 할 때이 오류가 발생합니다. "식은 값이므로 배정의 대상이 될 수 없습니다." – Pliskin

1

다른 답변에서 언급 한 것처럼, .Value를 사용하여 nullable의 내부 값에 액세스 할 수 있습니다. 하지만 그들은 당신이 myNullableInstance.Value.myNullVar = 1을하는 것이 좋습니다.

구조가 작동하기 때문입니다. 구조체의 멤버를 변경하면 새로운 struct 인스턴스가 만들어집니다. Value가 ReadOnly이므로 Nullable 클래스의 Value 속성을 직접 수정 할 수 없으므로이 작업을 수행 할 수 없습니다.

하지만 이것은 작동합니다 : 기본적으로

myNullableInstance.Value.myNullVar = 1 

, 당신은에 의해 반환 된 구조의 일부 사본에 할당 될 것이다 :

Dim myInstance as myNullable 
myInstance.myNullVar = 1 
myNullableInstance = myInstance 
0

이것이 작동하지 않습니다 의미가 있습니다 Value 속성

일반적으로 구조가 불변으로 이루어 지므로 실제로는 문제가되지 않습니다.을 사용하는 것이 좋습니다. 어떤 과제를 앞뒤로 처리하면 문제를 해결할 수 있지만 다른 사람들이 게시 할 때 클래스를 사용하여 다시 생각해야합니다. 그렇게하면 null 참조를 사용할 수 있기 때문에 Nullable도 필요하지 않습니다.

0

nullable structres는 고통이며 Microsoft가 어려운 일을해서는 안될 충분한 이유가 없습니다. 이 방법은 언어 사용자가 아닌 컴파일러 작성자가 쉽게 사용할 수 있도록합니다.

실제로 참조 유형과 값 유형이 다르게 동작해야하는 이유가 없습니다.Microsoft는 논리적 인 포인터 (주소)를 숨기려고하지만, 작업이 더 어렵지 않기 때문에 잘 작동하지 않습니다. 언어에 부과 된 모든 규칙 및 제한 사항으로 인해 상황이 더욱 어려워지고 비효율, 런타임 오류 및 높은 개발 비용이 발생합니다.

논리적으로 입력 된 포인터로 돌아 가면 더 나아질 것입니다. 그러면 우리는 불변의 단어처럼 멋진 단어를 필요로하지 않을 것입니다. (불변의 의미는 변경 불가능합니다!)

내 제안은 Nullable 구조를 버리고 항상 nullable 인 클래스로 만드는 것입니다.