2011-01-20 24 views
16

Tôi thường ở nhà trong C#, và tôi đang xem xét một vấn đề hiệu suất trong một số mã VB.NET - Tôi muốn có thể so sánh một cái gì đó với giá trị mặc định cho một loại (loại giống như từ khóa của C# 'default).Tương đương với `mặc định` của C# trong VB.NET là gì?

public class GenericThing<T1, T2> 
{ 
    public T1 Foo(T2 id) 
    { 
     if(id != default(T2)) // There doesn't appear to be an equivalent in VB.NET for this(?) 
     { 
      // ... 
     } 
    } 
} 

tôi được dẫn dắt để tin rằng Nothing là ngữ nghĩa giống nhau, nhưng nếu tôi làm:

Public Class GenericThing(Of T1, T2) 
    Public Function Foo(id As T2) As T1 
     If id IsNot Nothing Then 
      ' ... 
     End If 
    End Function 
End Class 

Sau đó, khi T2Integer, và giá trị của id0, tình trạng này vẫn trôi qua, và phần thân của if được đánh giá. Tuy nhiên nếu tôi làm:

Public Function Bar(id As Integer) As T1 
     If id <> Nothing Then 
      ' ... 
     End If 
    End Function 

Sau đó, tình trạng này không được đáp ứng, và cơ thể không được đánh giá ...

+1

có thể trùng lặp của [VB tương đương với mặc định của C# (T)] (http://stackoverflow.com/questions/833791/vb-equivalent-for-cs-defaultt) – decyclone

+2

@ decyclone câu hỏi đó không bao gồm trường hợp chung ; và trong thực tế trong câu hỏi của tôi, tôi thấy rằng tôi biết sử dụng 'Nothing' trong hầu hết các trường hợp ... –

Trả lời

10

Đây không phải là một giải pháp hoàn chỉnh, như ban đầu C# code của bạn không biên dịch. Bạn có thể sử dụng Không có gì qua biến cục bộ:

Public Class GenericThing(Of T) 
    Public Sub Foo(id As T) 
     Dim defaultValue As T = Nothing 
     If id <> defaultValue Then 
      Console.WriteLine("Not default") 
     Else 
      Console.WriteLine("Default") 
     End If 
    End Function 
End Class 

Điều đó không biên dịch, giống như cách phiên bản C# không biên dịch - bạn không thể so sánh giá trị của các tham số kiểu không bị giới hạn như vậy.

Bạn có thể sử dụng EqualityComparer(Of T) mặc dù - và sau đó bạn thậm chí không cần biến địa phương:

If Not EqualityComparer(Of T).Default.Equals(id, Nothing) Then 
+0

Tôi nghĩ rằng tôi đã mất quá nhiều điều khoản kinh doanh cụ thể trong ví dụ của tôi, nhưng * có vẻ * để làm việc cho các loại giá trị - bạn có biết nó hoạt động tốt như thế nào đối với các loại tham chiếu không? –

+0

@Rowland: Sẽ ổn thôi theo tôi biết. –

+0

Vâng, nó được biên soạn khi tôi gõ, vì vậy tôi sẽ sớm biết chắc chắn; Tôi có thể thấy cách đó sẽ buộc trình biên dịch thực hiện phép thuật và làm cho nó hoạt động –

19

Không giống như C#, VB.NET không đòi hỏi một biến địa phương được khởi tạo với một biểu thức. Nó được khởi tạo thành giá trị mặc định của nó theo thời gian chạy. Chỉ là những gì bạn cần là một thay thế cho các từ khóa mặc định: '? Huh'

Dim def As T2 '' Get the default value for T2 
    If id.Equals(def) Then 
     '' etc... 
    End If 

Đừng quên nhận xét, người ta sẽ làm cho ai đó đi một năm nữa tính từ bây giờ.

4

Sự cố trong mã của bạn là toán tử IsNot, không phải từ khóa Nothing. Từ số docs:

Toán tử IsNot xác định nếu hai tham chiếu đối tượng tham chiếu đến các đối tượng khác nhau. Tuy nhiên, nó không thực hiện so sánh giá trị.

Bạn đang cố gắng so sánh giá trị với toán tử tham chiếu. Một khi bạn nhận ra điều này, câu trả lời của Jon Skeet hoặc Hans Passant trở thành những giải pháp rõ ràng.

+0

Làm cho cảm giác hoàn hảo - nó luôn làm phiền tôi rằng VB có cả '=' và 'Is' để so sánh, với việc nhà phát triển biết liệu để so sánh giá trị hoặc loại tham chiếu tương ứng. –

+0

@Rowland - C# có toán tử "is". Tôi sử dụng quy tắc này làm việc cho cả C# và VB: sử dụng .Equals() đầu tiên, nếu trình biên dịch than phiền sử dụng ==/=, và nếu trình biên dịch vẫn than phiền sử dụng là. –

+0

@ Joel/Rowland, thói quen có ưu tiên cho tôi =/== với đối tượng/lớp .. Tôi có xu hướng sử dụng Equals khi sử dụng các kiểu nullable (Guid?, DateTime ?, v.v.). Tôi đi qua rất nhiều mã mà điều trị Guids không đúng (như dây) thay vì Guid? ... nó thực sự làm tôi khó hiểu hơn trong SQL khi tôi phải sử dụng là null, trong đó = null thường sẽ bork những gì tôi đang cố gắng làm. – Tracker1

Các vấn đề liên quan