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

时间:2010-09-20 11:09:56

标签: c# .net delegates initialization

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;
    }
}

那么“正确”的方式是什么?为什么?

5 个答案:

答案 0 :(得分:9)

它们都是正确的,但是method group conversion,这是在2.0(IIRC)中添加的第二个选项。即如果您使用的是旧版本的编译器,则需要使用第一个选项。否则,额外的打字真的是多余的。

答案 1 :(得分:3)

为了便于阅读,我总是使用第一种方法。第二个选项使得math.Sum是一个属性,并返回一个CalculationHandler结果。就个人而言,我认为这令人困惑。

答案 2 :(得分:1)

两者都是正确的。

第二个是编译器提供的快捷方式,它们实际上都创建了第一个代码。

第一个更清楚地显示了实际发生的情况,而第二个则更少的代码,因此更容易阅读(一旦你理解了真正发生的事情)。

答案 3 :(得分:1)

Personnaly我更喜欢第二个选项(方法组转换)。从功能的角度来看,我并不关心委托的类型,因为这不会给我任何关于调用时分配给委托的方法的提示。 然而,方法名称(至少应该)会让我很好地了解调用委托时会发生什么,而在第二个选项中我不必搜索方法名称。

作为旁注,如果您在事件处理程序注册时使用自动完成功能,VS将为您提供第一个版本。 Resharper将使用第二个并将第一个版本中代码的一部分标记为冗余。

答案 4 :(得分:0)

两种方式都可以,短版本只是C#编译器服务。第一种方式更详细,并准确显示发生了什么。两个版本都生成相同的IL代码,实际上接近第一个版本。