2009-11-03 32 views
6

Tôi tò mò những gì mọi người nghĩ. Trong SQL (ít nhất là trong oracle) NULL dịch khái niệm "Tôi không biết giá trị" vì vậy NULL = NULL là sai. (Có lẽ nó thực sự dẫn đến một NULL mà sau đó được đúc để giả hoặc một cái gì đó như thế ...)Nên null == null là đúng khi so sánh các đối tượng?

Điều này có ý nghĩa với tôi, nhưng trong hầu hết các ngôn ngữ OO null có nghĩa là "không tham khảo" vì vậy null == null nên có lẽ đúng. Đây là cách làm thông thường trong C# ví dụ khi ghi đè bằng. Mặt khác, null vẫn thường được sử dụng để có nghĩa là "Tôi không biết" trong ngôn ngữ hướng đối tượng và thực hiện null == null thành false có thể dẫn đến mã có ý nghĩa hơn một chút đối với một số miền nhất định.

Hãy cho tôi biết suy nghĩ của bạn.

+0

eh, trong đó null có nghĩa là "Tôi không biết" bằng ngôn ngữ OO? Và làm thế nào bạn sẽ kiểm tra con trỏ null nếu 'null == null' trả về' false'? – hasen

Trả lời

3

Tôi đã đủ khó chịu ở IEEE NaN không bằng với chính nó. Tôi có xu hướng xem == như một mối quan hệ tương đương, một trong những thuộc tính của nó là phản xạ. Nếu bạn có ngữ nghĩa đặc biệt về bình đẳng giá trị "không xác định", tôi nghĩ bạn nên sử dụng một cái gì đó cụ thể hơn là quá tải một toán tử có ngữ nghĩa được hiểu rõ. Ví dụ, chỉ vì bạn không biết nếu hai giá trị bằng nhau, không có nghĩa là chúng chắc chắn không bằng nhau, đó là những gì tôi đoán từ một giá trị trả về False từ ==. Có vẻ như bạn thực sự muốn một số loại logic bậc ba. Tùy thuộc vào ngôn ngữ của bạn, nó có thể hoặc có thể không dễ dàng cho bạn để đưa ra một ngắn gọn == - như nhau có thể trả về True hoặc False hoặc NoClue, nhưng tôi chắc chắn nghĩ rằng nó nên được tách biệt.

Chỉ cần ý kiến ​​của tôi về vấn đề mặc dù :)

+0

Đó là sự thật, "Tôi không biết" == "Tôi không biết" nên dẫn đến "Tôi không biết", không sai - mặc dù chuyển đổi từ "Tôi không biết" để giả ngầm dường như ok. –

+3

Tôi nghĩ bạn có nghĩa là 'True',' False', hoặc 'FileNotFound';) –

8

Tôi nghĩ rằng null trong Java, giống như NULL trong C++ hoặc Không bằng Python, phương tiện đặc biệt "không có gì ở đây" - không "I don' t biết ", đó là một khái niệm đặc biệt đối với SQL, không phổ biến trong các ngôn ngữ OOP.

+0

Tôi đồng ý. Trong mã, chúng ta thường BIẾT chúng ta có hoặc nhận được null - không có gì. Nhà nước là hữu hạn và dự đoán được. –

10

Để lập trình mục đích chung, null == null có lẽ nên trả về true.

Tôi không thể đếm số lần tôi đã chạy vào mô hình

if(obj != null) 
{ 
    //call methods on obj 
} 

, và nó thường dường như không thể tránh khỏi. Nếu null == null được đánh giá là false, mẫu này sẽ bị tách rời và sẽ không có cách nào tốt để xử lý trường hợp này mà không có ngoại lệ.

+0

Trong SQL có một toán tử đặc biệt cho cái gọi là 'is'. Vì vậy, để kiểm tra nếu một cái gì đó là NULL bạn sử dụng 'là NULL'. Đó cũng là thực tế phổ biến trong Python, mặc dù == cũng hoạt động. – gooli

+0

Tương tự, trong VB.NET bạn có: 'Không có gì ' –

1

Trước null == nulltrue làm mẫu như

if(!(instance == null)) { 
    // do something requiring instance not be null 
} 

làm việc. (Vâng, kiểm tra thông thường là instance != null nhưng tôi muốn làm rõ việc sử dụng !(null == null)false.)

Thứ hai, nếu bạn cần instance1 == instance2 là sai khi instance1instance2 những trường tham chiếu null của lớp học của bạn, sau đó nên này được đóng gói vào một lớp logic ở đâu đó. Trong C#, chúng tôi sẽ nói

class MyObjectComparer : IEqulityComparer<MyObject> { 
    public bool Equals(MyObject instance1, MyObject instances2) { 
     if(instance1 == null && instance2 == null) { 
      return false; 
     } 
     // logic here 
    } 

    public int GetHashCode(MyObject instance) { 
     // logic here 
    } 
} 
0

Tất cả các con trỏ null (hoặc tham chiếu) bằng nhau.

Họ , nếu không bạn sẽ so sánh con trỏ rỗng với null như thế nào?

+0

Cũng trong C# ít nhất là cách đúng để thực hiện kiểm tra null là object.ReferenceEquals (null, biến) –

+0

Điều này tốt hơn (hoặc khác) so với' p == null '? –

2

Nếu bạn nói null === null, tôi đồng ý với bạn.

+1

Hmm, đó là một điểm tốt thực sự. Một điểm thực sự rất tốt. –

+0

'===' là gì? – nawfal

0

C++: so sánh con trỏ null luôn trả về giá trị đúng. Nếu bằng cách nào đó bạn có một tham chiếu null (không làm điều đó) kết quả là sụp đổ.

0

Theo quan điểm của tôi, hành vi hiện tại là chính xác, đặc biệt nếu bạn xem xét rằng null được hiểu là "Giá trị không xác định".

Hãy suy nghĩ theo cách này: Nếu ai đó hỏi bạn có biết số lượng táo trong hai hộp mà bạn không biết nội dung bằng nhau hay không. Câu trả lời sẽ không có hoặc không, nó sẽ là "Tôi không biết."

+1

Chính xác, và đó là cách NULL trong SQL hoạt động, đó chỉ là một diễn viên tiềm ẩn giữa NULL và false –

3

Tôi nghĩ bạn đã có những thông tin cơ bản về SQL hoàn toàn sai.

NULL là giá trị dữ liệu và UNKNOWN là giá trị logic.

NULL = NULLUNKNOWN.

NULL = NULL chắc chắn không phải là FALSE!

Google cho "ba giá trị logic".

Giá trị NULL là trình giữ chỗ cho giá trị dữ liệu bị thiếu. Lý tưởng nhất, chỉ sử dụng cột NULL cho các giá trị tạm thời bị thiếu, tức là có một kỳ vọng hợp lý rằng giá trị không phải là NULL sẽ có sẵn trong tương lai, ví dụ: sử dụng giá trị NULL cho ngày kết thúc bằng một cặp giá trị DATETIME được sử dụng để lập mô hình một khoảng thời gian biểu thị vô cùng tức là khoảng thời gian này là hiện tại (mặc dù giá trị DATEITME cũng hoạt động tốt trong tương lai).

+0

Tôi không phải là một người SQL nên hoàn toàn có thể. Tôi làm việc chủ yếu với oracle và trong oracle NULL + bất cứ điều gì = NULL và SELECT 1 từ DUAL WHERE NULL = NULL trả về 0 hàng. Tôi đã đọc rằng điều này là bởi vì "Tôi không biết" là định nghĩa khái niệm về null. –

+0

Để bảo vệ bạn, tôi nghĩ đúng là Oracle không thực hiện đúng NULL. IIRC, '' [chuỗi rỗng] IS NULL là TRUE cho Oracle, trong khi trong SQL nó là FALSE. Lưu ý rằng NULL được xử lý khác nhau đối với SQL DDL, ví dụ: một ràng buộc CHECK cấp hàng mà đánh giá là NULL cho phép cập nhật thành công, một loại 'lợi ích của sự nghi ngờ' có hiệu lực. – onedaywhen

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