2010-04-19 31 views
16

Tôi đã đọc về quá tải đúng và sai trong C#, và tôi nghĩ rằng tôi hiểu sự khác biệt cơ bản giữa điều này và xác định một toán tử bool. Ví dụ tôi thấy xung quanh là một cái gì đó như:Tại sao quá tải đúng và sai thay vì xác định toán tử bool?

public static bool operator true(Foo foo) { 
    return (foo.PropA > 0); 
} 
public static bool operator false(Foo foo) { 
    return (foo.PropA <= 0); 
} 

Đối với tôi, đây là giống như nói:

public static implicit operator bool(Foo foo) { 
    return (foo.PropA > 0); 
} 

Sự khác biệt, như xa như tôi có thể nói, đó là bằng cách định nghĩa đúng và sai riêng biệt, bạn có thể có một đối tượng vừa đúng và sai hoặc không đúng hoặc sai:

public static bool operator true(Foo foo) { return true; } 
public static bool operator false(Foo foo) { return true; } 
//or 
public static bool operator true(Foo foo) { return false; } 
public static bool operator false(Foo foo) { return false; } 

Tôi chắc chắn có lý do được phép, nhưng tôi không thể nghĩ nó là gì. Với tôi, nếu bạn muốn một đối tượng có thể được chuyển đổi thành true hoặc false, thì một toán tử bool đơn giản nhất.

Có ai có thể cho tôi một kịch bản có ý nghĩa khi làm theo cách khác không?

Cảm ơn

+0

Tôi vừa tìm thấy các toán tử này và thực hiện một số thử nghiệm. Có vẻ như 'if' chỉ sử dụng toán tử' true', và 'if (! MyObj)' là không thể, vì vậy không có điểm (nào) trong việc thực thi toán tử 'false' mâu thuẫn. Tôi đã bỏ lỡ bất cứ điều gì? Làm thế nào tôi có thể sử dụng toán tử 'false'? – ygoe

Trả lời

11

Khi the docs nói, quá tải truefalse nhằm hỗ trợ các loại cơ sở dữ liệu (không có) (Có/Không, Y/N, 0/1, v.v ...).

Và tất nhiên bạn có thể xác định chúng không nhất quán, giống như với bất kỳ toán tử nào. Đó là trách nhiệm của bạn để trả lại một cái gì đó hợp lý. Trình biên dịch không đi xa hơn yêu cầu cả hai hoặc cả hai.

+0

Cảm ơn - Tôi đã không đạt được điều đó trong MSDN - tôi bắt đầu tìm kiếm ở nơi khác sau khi [nhà điều hành quá tải] của họ (http://msdn.microsoft.com/en-us/library/aa288467 (VS.71% 29.aspx " Tôi cho rằng tôi không nghĩ đến việc bạn có thể quá tải == /! = cùng một cách, nơi họ xung đột với nhau, tôi không bao giờ có thể tưởng tượng thực sự đang làm –

1

Tùy thuộc vào hệ thống, giá trị thực có thể là bất kỳ giá trị khác không. Ở những người khác, nó có thể là bất kỳ giá trị tích cực nào.

Các hệ thống khác không thực sự boolean, và cho phép giá trị boolean thứ ba hoặc nill cho các giá trị boolean, đó là lý do tại sao bạn có thể quá tải đúng và sai, so với quá tải một toán tử bool đơn.

+0

Điều này đặc biệt dành cho .NET, vậy bạn có nói rằng nó dành cho các ứng dụng .NET đang nói chuyện với mã không phải là .NET không? –

+0

Joe, đây là một tính năng trong đặc tả cho C#, chứ không phải .NET. C# có thể được sử dụng trong bất kỳ hệ thống nào, và đúng và sai có thể cần định nghĩa của chúng thay đổi. –

+0

Benjamin: Cảm ơn bạn đã phản hồi - một vài nhận xét: Trước tiên, tôi tin rằng đây là trường hợp đối với các ngôn ngữ .NET khác, không chỉ C# - VB.NET có các toán tử đặc biệt IsTrue và IsFalse dường như giống nhau, trừ khi tôi bị nhầm lẫn. Ngoài ra, bạn đã đề cập rằng C# có thể được sử dụng trong bất kỳ hệ thống nào - Tôi đã nghe một vài người nói những điều như thế này trong quá khứ, nhưng tôi chưa bao giờ nghe giải thích. Khác với Mono, có bất kỳ nơi nào khác bên ngoài .NET nơi C# thực sự được sử dụng không? Cảm ơn –

1

Tôi đã thấy mọi người quá tải các sự cố quá tải truefalse để thực hiện những việc thông minh như xây dựng biểu thức trong .NET 2.0, trước khi LINQ tồn tại.

Ayende làm việc ra một cú pháp như thế này để xây dựng các tiêu chí NHibernate truy vấn, sử dụng dự án NHQG của mình:

return Repository.FindAll(
    (Where.Publisher.Name == name) && 
    (Where.Publisher.City == city)); 
+5

Ahh, những ngày trước LINQ ... Đó là những lần vô tội khi mọi người làm những điều tồi tệ, thông minh vào thời điểm đó ... –

7

Tôi không biết các nhà khai thác tồn tại. Điều đó có nghĩa là bạn có thể triển khai nghịch lý tự phủ định:

public class ThisClassIsFalse 
{ 
    public static bool operator true(ThisClassIsFalse statement) 
    { 
     return statement ? false : true; 
    } 

    public static bool operator false(ThisClassIsFalse statement) 
    { 
     return statement ? true : false; 
    } 
} 

Vì vậy, bây giờ chúng tôi biết giải pháp thực sự cho nghịch lý cổ điển này ... StackOverflowException.

+0

bool công khai ThisMethodReturnsFalse() {return true;} –

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