C#代表一直很难掌握,所以我很高兴偶然发现logicchild's article on The Code Project web site titled "C# Delegates: Step by Step"。他有一种非常简洁的方式来解释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;
}
}
那么“正确”的方式是什么?为什么?
答案 0 :(得分:9)
它们都是正确的,但是method group conversion,这是在2.0(IIRC)中添加的第二个选项。即如果您使用的是旧版本的编译器,则需要使用第一个选项。否则,额外的打字真的是多余的。
答案 1 :(得分:3)
为了便于阅读,我总是使用第一种方法。第二个选项使得math.Sum是一个属性,并返回一个CalculationHandler结果。就个人而言,我认为这令人困惑。
答案 2 :(得分:1)
两者都是正确的。
第二个是编译器提供的快捷方式,它们实际上都创建了第一个代码。
第一个更清楚地显示了实际发生的情况,而第二个则更少的代码,因此更容易阅读(一旦你理解了真正发生的事情)。
答案 3 :(得分:1)
Personnaly我更喜欢第二个选项(方法组转换)。从功能的角度来看,我并不关心委托的类型,因为这不会给我任何关于调用时分配给委托的方法的提示。 然而,方法名称(至少应该)会让我很好地了解调用委托时会发生什么,而在第二个选项中我不必搜索方法名称。
作为旁注,如果您在事件处理程序注册时使用自动完成功能,VS将为您提供第一个版本。 Resharper将使用第二个并将第一个版本中代码的一部分标记为冗余。
答案 4 :(得分:0)
两种方式都可以,短版本只是C#编译器服务。第一种方式更详细,并准确显示发生了什么。两个版本都生成相同的IL代码,实际上接近第一个版本。