IsNoth so với Is nothing


130

Có ai ở đây sử dụng VB.NET và có một ưu tiên mạnh mẽ cho hoặc không sử dụng IsNothingtrái ngược với Is Nothing(ví dụ, If IsNothing(anObject)hoặc If anObject Is Nothing...) không? Nếu vậy, tại sao?

EDIT: Nếu bạn nghĩ rằng cả hai đều chấp nhận được như nhau, bạn có nghĩ rằng tốt nhất là chọn một và gắn bó với nó, hoặc có ổn không khi trộn chúng?


3
rất nhiều lý do tốt để tránh sử dụngIsNothing()
KyleMit

@JesseChisholm, Có quá nhiều cho một bình luận, nhưng bình luận trước đó của tôi đã đăng liên kết này đến một bài viết liệt kê 5 blog
KyleMit

Các câu trả lời công nghệ thực sự thú vị, nhưng xấu hổ là câu hỏi bị bỏ ngỏ và tạo ra một số câu trả lời không có ích gì, chỉ là sở thích cá nhân ngày càng mơ hồ
underscore_d

Câu trả lời:


125

Nếu bạn xem MSIL khi nó được thực thi, bạn sẽ thấy rằng nó không biên dịch theo cùng một mã chính xác. Khi bạn sử dụng IsNoth (), nó thực sự thực hiện một cuộc gọi đến phương thức đó chứ không phải chỉ đánh giá biểu thức.

Lý do tôi có xu hướng nghiêng về việc sử dụng "Is nothing" là khi tôi phủ nhận nó trở thành "IsNot nothing" thay vì "Not IsNoth (object)" mà cá nhân tôi cảm thấy dễ đọc hơn.


46

Tôi thấy rằng Patrick Steele đã trả lời câu hỏi này tốt nhất trên blog của mình: Tránh IsNoth ()

Tôi đã không sao chép bất kỳ câu trả lời nào của anh ấy ở đây, để đảm bảo Patrick Steele nhận được tín dụng cho bài đăng của anh ấy. Nhưng tôi nghĩ rằng nếu bạn đang cố gắng quyết định nên sử dụng Is nothing hay IsNellow thì bạn nên đọc bài viết của anh ấy. Tôi nghĩ bạn sẽ đồng ý rằng Không có gì là sự lựa chọn tốt nhất.

Chỉnh sửa - Bình luận của VoteCoffe tại đây

Nội dung bài viết một phần: Sau khi xem xét thêm mã tôi đã tìm ra một lý do khác bạn nên tránh điều này: Nó chấp nhận các loại giá trị! Rõ ràng, vì IsNoth () là một hàm chấp nhận một 'đối tượng', bạn có thể chuyển bất cứ thứ gì bạn muốn cho nó. Nếu đó là một loại giá trị, .NET sẽ đóng hộp nó vào một đối tượng và chuyển nó tới IsNoth - sẽ luôn trả về giá trị sai trên giá trị được đóng hộp! Trình biên dịch VB.NET sẽ kiểm tra cú pháp kiểu "Is nothing" và sẽ không biên dịch nếu bạn cố thực hiện "Is nothing" trên một loại giá trị. Nhưng hàm IsNoth () biên dịch mà không có khiếu nại. -PSteele - Bầu chọn


7
Nội dung bài viết một phần: Sau khi xem xét thêm mã tôi đã tìm ra một lý do khác bạn nên tránh điều này: Nó chấp nhận các loại giá trị! Rõ ràng, vì IsNoth () là một hàm chấp nhận một 'đối tượng', bạn có thể chuyển bất cứ thứ gì bạn muốn cho nó. Nếu đó là một loại giá trị, .NET sẽ đóng hộp nó vào một đối tượng và chuyển nó tới IsNoth - sẽ luôn trả về giá trị sai trên giá trị được đóng hộp! Trình biên dịch VB.NET sẽ kiểm tra cú pháp kiểu "Is nothing" và sẽ không biên dịch nếu bạn cố thực hiện "Is nothing" trên một loại giá trị. Nhưng hàm IsNoth () biên dịch mà không có khiếu nại. -PSteele
VoteCoffee

7
Đăng một số nội dung như bạn không bao giờ biết nếu liên kết sẽ trở nên chết và tôi nghĩ rằng nó đã thêm một điểm tốt cho trang bìa.
VoteCoffee

33

Bạn tuyệt đối nên tránh sử dụng IsNothing()

Dưới đây là 4 lý do từ bài viết IsNoth () VS Is nothing

  1. Quan trọng nhất, IsNothing(object)có tất cả mọi thứ được truyền cho nó như một đối tượng, thậm chí các loại giá trị! Vì các loại giá trị không thể Nothing, đó là một kiểm tra hoàn toàn lãng phí.
    Lấy ví dụ sau:

    Dim i As Integer
    If IsNothing(i) Then
       ' Do something 
    End If

    Điều này sẽ biên dịch và chạy tốt, trong khi điều này:

    Dim i As Integer
    If i Is Nothing Then
        '   Do something 
    End If

    Sẽ không biên dịch, thay vào đó trình biên dịch sẽ đưa ra lỗi:

    Toán tử 'Is' không chấp nhận toán hạng loại 'Integer'.
    Toán tử phải là kiểu tham chiếu hoặc nullable.

  2. IsNothing(object)thực sự là một phần của một phần của Microsoft.VisualBasic.dll.
    Điều này là không mong muốn vì bạn có một sự phụ thuộc không cần thiết vào thư viện VisualBasic.

  3. Nó chậm - thực tế chậm hơn 33,76% (hơn 1000000000 lần lặp)!

  4. Có lẽ sở thích cá nhân, nhưng IsNothing()đọc như một Điều kiện Yoda . Khi bạn nhìn vào một biến bạn đang kiểm tra trạng thái của nó, với nó là chủ đề điều tra của bạn.

    tức là làm x? --- KHÔNG phải là xmột tài sản của ?

    Vì vậy, tôi nghĩ rằng If a IsNot Nothingđọc tốt hơnIf Not IsNothing(a)


29

Tôi đồng ý với "Không là gì". Như đã nêu ở trên, thật dễ dàng để phủ nhận với "IsNot nothing".

Tôi thấy điều này dễ đọc hơn ...

If printDialog IsNot Nothing Then
    'blah
End If

hơn cái này...

If Not obj Is Nothing Then
    'blah
End If

5

VB có rất nhiều thứ giống như vậy khi cố gắng làm cho nó vừa "giống tiếng Anh" vừa thoải mái cho những người đã quen với các ngôn ngữ sử dụng () và {} rất nhiều. Ví dụ: về phía "thích tiếng Anh" ... VB có từ khóa " Không " ... và không, tôi không nói đùa. Và mặt khác, như bạn có thể đã biết hầu hết thời gian bạn có thể sử dụng () với các lệnh gọi hàm nếu bạn muốn, nhưng không phải.

Tôi thích IsNoth () ... nhưng tôi sử dụng C và C #, vì vậy đó là những gì thoải mái. Và tôi nghĩ nó dễ đọc hơn. Nhưng đi với bất cứ điều gì cảm thấy thoải mái hơn với bạn.


3
Liên kết của bạn đã chết vì vậy giá trị của nó ở đây là một liên kết trực tiếp: web.archive.org/web/20050308014055/http://ea.3leaf.com/2004/08/. Đáng chú ý tuy nhiên trái với niềm tin phổ biến này là không đúng.
Matt Wilko

5

Tôi đang nghiêng về sự thay thế "Không là gì", chủ yếu là vì nó có vẻ nhiều OO hơn.

Chắc chắn Visual Basic không có từ khóa Ain't.


VB.NET có thể làm các phương thức mở rộng không? :)
klk bếp 17/03/2016

2

Tôi cũng có xu hướng sử dụng phiên bản Không có gì một phần từ việc sử dụng nó nhiều như tôi làm trong SQL.


1

Ban đầu tôi đã sử dụng IsNoth nhưng tôi đã chuyển sang sử dụng Is nothing trong các dự án mới hơn, chủ yếu để dễ đọc. Lần duy nhất tôi gắn bó với IsNoth là nếu tôi duy trì mã nơi được sử dụng xuyên suốt và tôi muốn duy trì sự nhất quán.


-2

Không có gì đòi hỏi một đối tượng đã được gán cho giá trị Không có gì. IsNoth () có thể lấy bất kỳ biến nào chưa được khởi tạo, bao gồm cả kiểu số. Điều này hữu ích ví dụ khi kiểm tra nếu một tham số tùy chọn đã được thông qua.


Cái này sai. Bạn có chắc là bạn đã không hiểu sai? " IsNoth dự định hoạt động trên các loại tham chiếu. Loại giá trị không thể giữ giá trị Không có gì và trở về giá trị mặc định nếu bạn gán Không có gì [...] IsNoth luôn trả về Sai ." Nhưng "Đại diện cho giá trị mặc định của bất kỳ loại dữ liệu nào. [...] Đối với các loại giá trị, [điều này] phụ thuộc vào loại giá trị có thể không." Vậy có tốt hơn không? Nothing Is Nothing
gạch dưới
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.