簡體   English   中英

初始化 C# 委托的“正確”方法是什么?

[英]What is the "correct" way to initialize a C# delegate?

C# 委托對我來說一直很難掌握,因此我很高興在 The Code Project 網站上偶然發現了logicchild 題為“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;
    }
}

那么哪個是“正確”的方式,為什么?

它們都是正確的,但方法組轉換 ,這是第二個選項在2.0(IIRC)中添加。 即如果您使用舊版本的編譯器,則需要使用第一個選項。 否則,額外的打字真的是多余的。

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

兩者都是正確的。

第二個是編譯器提供的快捷方式,它們實際上都創建了第一個的代碼。

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

Personnaly我更喜歡第二個選項(方法組轉換)。 從功能的角度來看,我並不關心委托的類型,因為這不會給我任何關於調用時分配給委托的方法的提示。 然而,方法名稱(至少應該)讓我很好地了解調用委托時會發生什么,而在第二個選項中我不必搜索方法名稱。

作為附注,如果您使用自動完成功能和事件處理程序注冊,VS將為您提供第一個版本。 Resharper將使用第二個並將第一個版本中的代碼部分標記為冗余。

兩種方式都可以,短版本只是C#編譯服務。 第一種方式更詳細,並准確顯示發生了什么。 兩個版本都生成相同的IL代碼,實際上接近第一個版本。

我還將添加 lambda 表達式初始化的其他變體,這在某些情況下很有用:

    Func<int, int, int> func = Sum;
    func = new Func<int, int, int>(Sum);
    func = (x, y) => Sum(x, y);

我不完全相信所有情況下的 IL 代碼都會相同(我沒有檢查它,使用 lambda 表達式可以存在“中間調用”/“變量”),但最后一個可以提供額外的變體來調用方法

func = (int _, int y) => Sum(5, y);
func = (_, y) => Sum(5, y);
     

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM