2008-11-19 34 views
23

tôi chạy qua đây và đã tự hỏi nếu ai đó có thể giải thích tại sao điều này làm việc trong VB.NET khi tôi mong chờ nó nên thất bại, giống như nó trong C#C# vs VB.NET - Xử lý các cấu trúc rỗng

//The C# Version 

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

Nhưng sau đó trong VB.NET ...

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

is Nothing không giống như null (không có gì = null -!? LOL), hoặc là này cách khác nhau chỉ xử lý tình huống tương tự giữa hai ngôn ngữ?

Lý do tại sao hoặc những gì được xử lý khác nhau giữa hai điều làm cho điều này ổn thỏa trong một, nhưng không phải là điều kia?

[Cập nhật]

Với một số ý kiến, tôi sai lầm với điều này hơn một chút ... có vẻ như là nếu bạn thực sự phải sử dụng Nullable nếu bạn muốn cho phép một cái gì đó để được null trong VB NET ... do đó, ví dụ ...

'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' 

quá lạ ...

+0

Tôi chỉ tình cờ gặp trong khi chuyển một số VB.NET sang C# - khiến tôi ghét VB.NET nhiều hơn nữa;). Cảm ơn bạn đã đào sâu vào điều này và cảm ơn những người đã trả lời. – Charles

+0

Xem thêm http://stackoverflow.com/questions/5869661/why-can-i-not-check-if-datetime-is-nothing – jeroenh

+0

@Charles, tôi có nên ghét C# vì khác với VB không? Một số người giải quyết vấn đề. Một số ngôn ngữ đổ lỗi cho là khác nhau. – Dima

Trả lời

30

Nếu tôi nhớ không lầm, 'Không có gì' trong VB có nghĩa là "giá trị mặc định". Đối với loại giá trị, đó là giá trị mặc định, cho loại tham chiếu, sẽ là giá trị rỗng. Do đó, không gán gì cho cấu trúc, không có vấn đề gì cả.

+0

Rất thú vị – Hugoware

+4

Rất thú vị! Vì vậy, trong trường hợp này: 'Nothing' không phải là 'Nothing' ... – awe

12

Nothing tương đương với default(T) cho loại có liên quan. (Chỉ cần kiểm tra, và điều này cũng đúng đối với các chuỗi - tức là Nothing là tham chiếu null trong ngữ cảnh của chuỗi.)

+2

Có, nhưng cuối cùng tôi đã kiểm tra, chuỗi rỗng cũng không có gì. Hoặc là 'IsNothing (" ")' hoặc '" "Không có gì' trả về' True'. Có lẽ là cả hai. Nếu nó không phải là cả hai, thì sự khác biệt là khủng khiếp. – Phong

0

Ngoài ra, cấu trúc là các loại giá trị (giống như int, char, v.v.) và do đó không phải là -nullable.

+0

Cũng sử dụng Nullable hay? (C#), bạn có thể tạo cấu trúc null. Đó là lý do tại sao tôi đã rất sốc khi nó làm việc với VB.NET mà không sử dụng Nullable. – Hugoware

+1

@HBoss: Sử dụng không có giá trị, bạn có thể thực hiện bất kỳ giá trị nào! Ngay cả một 'Integer'. Tôi đã ngạc nhiên bởi câu trả lời được chấp nhận bởi ** BFree **, và may mắn là nó trả lời câu hỏi của tôi đã dẫn tôi đến bài đăng này: Làm thế nào bạn có thể khởi tạo Cấu trúc với giá trị mặc định của nó ...;) – awe

1

Tôi đã cố gắng tìm kiếm trên MSDN nhưng không thể tìm thấy bất kỳ điều gì có liên quan ở phía VB. Khi tìm kiếm "struct" trên C#, nó trả về một cách rõ ràng rằng đó là một Value Type và không thể gán null vì ... nó là một giá trị.

Tuy nhiên, khi tìm kiếm từ khóa VB.NET "Cấu trúc", nó không nói "Loại giá trị". Thay vào đó, nó nói

Câu lệnh cấu trúc xác định loại giá trị tổng hợp mà bạn có thể tùy chỉnh.

Vì vậy ... đối tượng?

Đó sẽ là phỏng đoán của tôi. Tôi muốn có tham chiếu đến hành vi này nhưng không thể tìm thấy bất kỳ hành vi nào.

+0

Không, đối tượng sẽ là ' Lớp ', giá trị rỗng là mặc định. Cấu trúc là một kiểu giá trị phức tạp có thể được tạo thành từ nhiều giá trị và thậm chí cả các phương thức. Sự khác biệt thực tế đối với 'Lớp' là' Cấu trúc' được khởi tạo với một thể hiện thực tế. Khởi tạo nó bằng 'Nothing' chỉ xác định rằng nó sẽ được đặt thành giá trị mặc định của nó, là NOT (hoặc như chúng ta thường nói trong VB: Nothing) – awe

0

Vì cấu trúc được tạo thành từ một số loại khác nhau (không phải một loại giá trị duy nhất, nhưng có thể là một số loại khác nhau), hỏi xem "Không có gì" có thể phá vỡ logic của việc sử dụng "Không ". Không có bài kiểm tra nào khác nhau tùy thuộc vào loại bạn đang thử nghiệm và do đó một loại phức tạp không tuân theo logic của việc sử dụng "Không có gì". Tuy nhiên, đối với loại thử nghiệm này, tức là, với cấu trúc có tất cả các thành viên thành phần của nó ở các giá trị "Không có gì" tương ứng, chúng tôi sử dụng hàm "IsNothing". Ví dụ:

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 
Các vấn đề liên quan