2008-11-19 13 views
23

natknąłem to i zastanawiałem się, czy ktoś może wyjaśnić, dlaczego to działa w VB.NET, gdy Spodziewam się, że nie powinien, tak jak to robi w C#C# vs VB.NET - Postępowanie z zerowymi Structures

//The C# Version 

struct Person { 
    public string name; 
} 
... 
Person someone = null; //Nope! Can't do that!! 
Person? someoneElse = null; //No problem, just like expected 

Ale wtedy w VB.NET ...

Structure Person 
    Public name As String 
End Structure 
... 
Dim someone As Person = Nothing 'Wha? this is okay? 

Nic nie jest taka sama, jak wartość null (Nic = null -! LOL), czy jest to po prostu różne sposoby obchodzenia się z samą sytuację między dwa języki?

Dlaczego lub co jest obsługiwane w różny sposób między tymi dwoma, które sprawiają, że wszystko jest w porządku, ale nie drugie?

[Aktualizacja]

Biorąc pod uwagę niektóre komentarze, mam pomieszane z tym nieco bardziej ... wydaje się, że rzeczywiście trzeba używać pustych jeśli chcesz zezwolić na coś być null w VB NET ... tak na przykład ...

'This is false - It is still a person' 
Dim someone As Person = Nothing 
Dim isSomeoneNull As Boolean = someone.Equals(Nothing) 'false' 

'This is true - the result is actually nullable now' 
Dim someoneElse As Nullable(Of Person) = Nothing 
Dim isSomeoneElseNull As Boolean = someoneElse.Equals(Nothing) 'true' 

zbyt dziwne ...

+0

Po prostu natknąłem się podczas portowania niektórych VB.NET do C# - sprawia, że ​​nienawidzę VB.NET o wiele więcej;). Dziękuję za wkopanie się w to i dzięki tym, którzy odpowiedzieli. – Charles

+0

Zobacz także http://stackoverflow.com/questions/5869661/why-can-i-not-check-if-datetime-is-nothing – jeroenh

+0

@Charles, czy powinienem nienawidzić C# za bycie innym niż VB? Niektórzy ludzie rozwiązują problemy. Niektóre winią języki za to, że są różne. – Dima

Odpowiedz

30

Jeśli dobrze pamiętam, 'nic' w VB oznacza "wartość domyślna". W przypadku typu wartości jest to wartość domyślna dla typu odwołania, która byłaby zerowa. Zatem przypisanie nic do struktury, nie stanowi problemu.

+0

Bardzo interesujące – Hugoware

+4

Bardzo interesujące w rzeczywistości! Tak więc w tym przypadku: "Nic" nie jest "Nic" ... – awe

12

Nothing jest mniej więcej równoważne z default(T) dla odpowiedniego typu. (Właśnie sprawdzono, i to jest również prawdziwe w przypadku łańcuchów znaków), tzn. Nothing jest odwołaniem zerowym w kontekście łańcuchów.)

+2

Tak, ale ostatnio sprawdziłem, pusty ciąg jest również Nic. Albo 'IsNothing (" ")' lub '" "Is Nothing' zwraca" True ". Może to jedno i drugie. Jeśli nie oba, rozbieżność jest straszna. – Phong

0

Również, struktury są typami wartości (podobnie jak int, char itp.), A zatem nie są -nullable.

+0

Dobrze używając Nullable lub? (C#), możesz utworzyć struct null. Właśnie dlatego byłem tak zszokowany, kiedy działał z VB.NET bez użycia Nullable. – Hugoware

+1

@HBoss: Używając nullable, możesz uczynić WSZYSTKIE zero! Nawet "Integer". Zaskoczyła mnie zaakceptowana odpowiedź ** BFree **, i na szczęście odpowiedziała na moje pytanie, które doprowadziło mnie do tego posta: Jak zainicjować Strukturę z jego domyślną wartością ...;) – awe

1

Próbowałem wyszukać go na MSDN, ale nie mogłem znaleźć niczego istotnego po stronie VB. Podczas wyszukiwania "struct" w języku C#, wyraźnie zwraca, że ​​jest to typ wartości i nie można mu przypisać wartości null, ponieważ ... jest to wartość.

Jednak, patrząc na słowo kluczowe VB.NET "Struktura", nie mówi "Typ wartości". Zamiast tego mówi

Oświadczenie Struktura definiuje kompozytowy typ wartości, że można dostosować.

Więc ... obiekt?

To byłby mój domysł. Chciałbym mieć odniesienia do tego zachowania, ale nie mogłem go znaleźć.

+0

Nie, obiekt byłby ' Klasa ", która ma wartość zerową jako domyślną. Struktura jest złożonym typem wartości, który może być zbudowany z kilku wartości, a nawet metod. Praktyczną różnicą w stosunku do "Klasy" jest fakt, że "Struktura" jest zainicjalizowana rzeczywistą instancją. Inicjowanie go przez 'Nic' po prostu określa, że ​​powinno ono być ustawione na wartość domyślną, która NIE jest zerowa (lub jak zwykle mówimy w VB: Nic) – awe

0

Ponieważ struktura składa się z prawdopodobnie kilku różnych typów (nie jest to typ wartości pojedynczej, ale możliwy kombinacja kilku różnych typów), aby zapytać, czy "nic" nie złamie logiki użycia "nic" ". Nic nie testuje się inaczej w zależności od typu testowanego, dlatego złożony typ nie jest zgodny z logiką używania "nic". Jednak dla tego typu testowania, tj. Z konstrukcją mającą wszystkie elementy składowe przy ich odpowiednich wartościach "nic", korzystamy z funkcji "IsNothing". Na przykład:

Public Class Employees 
    Public Structure EmployeeInfoType 
     Dim Name As String ' String 
     Dim Age as Integer ' Integer 
     Dim Salary as Single ' Single 
    End Structure 

    Private MyEmp as New EmployeeInfoType 

    Public Function IsEmployeeNothing(Employee As EmployeeInfoType) As Boolean 
     If **IsNothing**(Employee) Then 
      Return True 
     Else 
      Return False 
     End If 
    End Function 
End Class