2010-09-20 64 views
6

C#代表對我來說一直很難掌握,所以我很高興在logicchild's article on The Code Project web site titled "C# Delegates: Step by Step"上偶然發現。他有一個非常簡潔的解釋C#代表的方式,我可以推薦給你。然而,在嘗試的例子中,我看到了兩種方法來初始化一個委託,主要是:初始化C#委託的「正確」方式是什麼?

//create a new instance of the delegate class 
    CalculationHandler sumHandler1 = new CalculationHandler(math.Sum); 
    //invoke the delegate 
    int result = sumHandler1(8, 9); 
    Console.WriteLine("Result 1 is: " + result); 

CalculationHandler sumHandler2 = math.Sum; 
    //invoke the delegate 
    int result = sumHandler2(8, 9); 
    Console.WriteLine("Result 2 is: " + result); 

在數學課上被定義爲

public class Math 
{ 
    public int Sum(int x, int y) 
    { 
     return x + y; 
    } 
} 

那麼哪個是「正確」的方式,爲什麼?

回答

7

它們都是正確的,但method group conversion,這是第二個選項被添加到2.0(IIRC)。即如果您使用的是舊版本的編譯器,則需要使用第一個選項。否則,額外的打字真的是多餘的。

3

爲了便於閱讀,我總是使用第一種方法。第二個選項使得它顯示math.Sum是一個屬性並返回一個CalculationHandler的結果。就我個人而言,我認爲這很令人困惑。

+6

哇。許多犯罪行爲都是「爲了可讀性」而做出的,其中突出的是編寫長而複雜的代碼,而不是簡明扼要的代碼。這與可讀性相反。 – 2010-09-20 11:18:37

+0

有趣我使用第二個可讀性。只是去顯示可讀性是主觀的 – 2010-09-20 11:18:59

+1

@Konrad,長不會自動平等複雜。短不等於可讀。 RegEx讓人想起......事實是,「更長」的方式更緊密地遵循C#中其他所有工作的方式。較短的方式可能會讓人困惑。我幾乎不會調用CalculationHandler sumHandler1 = new CalculationHandler(math.Sum);犯罪。 – colithium 2010-09-21 10:00:03

0

兩種方式都行,短版本只是C#編譯服務。第一種方法更詳細,並顯示發生了什麼。兩個版本都產生相同的IL代碼,這實際上接近於第一個版本。

1

兩者都是正確的。

第二個是編譯器提供的快捷方式,兩者都確實創建了第一個代碼。

第一個更清楚地顯示實際發生的情況,第二個更少代碼,所以它更容易閱讀(一旦你明白了實際發生的事情)。

1

Personnaly我更喜歡第二個選項(方法組轉換)。從功能的角度來看,我不關心委託類型,因爲這不會給我任何提示被調用時分配給委託的方法。 然而,方法名稱(至少應該)會告訴我調用委託時會發生什麼,而在第二個選項中,我不必搜索方法名稱。

作爲一個便箋VS會給你第一個版本,如果你使用自動完成與事件處理程序註冊。 Resharper將使用第二個版本,並將第一個版本中的部分代碼標記爲冗餘。

相關問題