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

什么是「;“正确”;初始化C#委托的方法?,c#,.net,delegates,initialization,C#,.net,Delegates,Initialization,C#代表对我来说总是很难理解,所以我很高兴偶然发现了他们。他对C#delegations的解释非常简洁,我可以向你们推荐。但是,在尝试这些示例时,我发现有两种方法可以初始化委托,主要是: //create a new instance of the delegate class CalculationHandler sumHandler1 = new CalculationHandler(math.Sum); //invoke the delegate int r

C#代表对我来说总是很难理解,所以我很高兴偶然发现了他们。他对C#delegations的解释非常简洁,我可以向你们推荐。但是,在尝试这些示例时,我发现有两种方法可以初始化委托,主要是:

    //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);

其中数学类定义为

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

那么,哪种方法是“正确的”以及为什么?

它们都是正确的,但是,第二个选项是在2.0(IIRC)中添加的。例如,如果您使用的是旧版本的编译器,则需要使用第一个选项。否则,额外的输入是多余的

为了可读性,我总是使用第一种方法。第二个选项显示math.Sum是一个属性,返回的结果是CalculationHandler。就个人而言,我认为这很令人困惑。

两种方法都可以,短版本只是C#编译器服务。第一种方法更为详细,并准确地显示了发生的情况。两个版本产生相同的IL代码,实际上与第一个版本非常接近。

两个版本都是正确的

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


第一个选项更清楚地显示了实际发生的情况,而第二个选项代码较少,因此更易于阅读(一旦您了解了实际发生的情况)。

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


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

Whoa。许多犯罪行为都是“为了可读性”,其中最突出的是编写长而复杂的代码,而不是清晰、简洁的代码。这是可读性的反面。有趣的是,我用第二个表示可读性。这表明可读性是非常重要的subjective@Konrad,long并不自动等于卷积。而且short并不自动等于readable。我想到了正则表达式。。。事实上,“更长”的方式更接近于C#中的其他方式。较短的方法可能会令人困惑。我几乎不会将CalculationHandler称为sumHandler1=newCalculationHandler(math.Sum);犯罪,不是自动的,是真的。但是你的代码增加了不必要的冗余,我觉得很难证明这一点。“为了可读性”不是一个理由,它是一个不合理的主张。@Konrad我正在证明为什么我认为它使它更可读(遵循现有模式)。我想是个人喜好吧。[出于对引发火焰战的恐惧,敬请远离评论帖子]
public class math
{
    public int Sum(int x, int y)
    {
        return x + y;
    }
}