2013-02-23 96 views
1

代表,是的我想了解這個概念的使用,它有助於在C#中解決哪些問題。到目前爲止,我非常喜歡它提供代碼的Decoupling工具。然後我遇到了謂語代表。根據this MSDN library article it shows they are, delegates that takes any data type paramter and returns a bool type value...只能將謂詞委託調用爲布爾委託?

它還說,這個特別代表採取仿製藥,<T>,能說那麼任何類型...

因此,它是正確的說謂詞委託僅僅是一個布爾代表?這意味着任何具有布爾返回類型的委託?還是有更多的指定與不同的名稱:謂詞委託..?

E.g.

delegate bool BooleanDelegate(anytype parameter); 
BooleanDelegate bd = new BooleanDelegate(yesno);  
//assuming parameter type is int 
MessageBox.Show(bd.Invoke(2).ToString()); 

public bool yesno(anytype parameter) 
{  
    If (parameter == 2) 
    { 
     return true; 
    } 
    Else 
    { 
     return false; 
    }  
} 

回答

3

通常,謂詞是一個布爾值函數。所以是的,任何返回布爾值的函數都是謂詞。

2

是的,Predicate<T>代表一種方法,它接受T類型的一個參數,並返回bool。例如,Predicate<string>表示接收string並返回bool的方法。

例如:

Predicate<string> p = String.IsNullOrEmpty; // this static method has the correct signature and return type 

,使用它可以說

bool answer = p("your words"); 

仿製藥是指T可以在不同情況下有不同的含義。所以,你不必做一大堆的委託類型像StringPredicateDateTimePredicateBicyclePredicate,等等,但你可以使用Predicate<DateTime>Predicate<Bicycle>,...

一個Predicate<T>具有相同的簽名和返回類型一個Func<T, bool>(在.NET 3.5版中引入)。兩者在T中都是不相容的。

您:

因此,它是正確的說謂詞委託僅僅是一個布爾代表?

其簽名必須是正確的。必須只有一個參數(不是零,或者兩個或更多)。參數不能是refout。該參數必須具有正確的類型T(但T的含義可能不同)。例如,採用Bicycle的方法可能是Predicate<Bicycle>,但不是Predicate<DateTime>

+0

謝謝,抱歉花了我的時間來體驗,並在同一行上有更多questiosn :)你說***參數不能是ref或out。***,所以它必須是'param'? – aspiring 2013-02-28 03:36:59

+0

當我們查看Predicate <>的[signature](http://msdn.microsoft.com/en-us/library/bfcke1bz.aspx)時,我們發現參數'T obj'確實不會攜帶'params '修飾者。它不能,因爲我們不知道'T'是否是一個'SomeType []'數組。當委託類型簽名不具有「params」時,如果方法具有「params」,則方法必須以未擴展的形式應用。例如。如果方法是靜態布爾Meth(params string [] args){...}',那麼你可以說'Predicate p1 = Meth;',但是你不能擴展,所以它不能用'Predicate p2 = Meth;'。 – 2013-02-28 06:16:27