[英]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.