2010-09-20 92 views
6

C#代表对我来说一直很难掌握,所以我很高兴在logicchild's article on The Code Project web site titled "C# Delegates: Step by Step"上偶然发现。他有一个非常简洁的解释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; 
    } 
} 

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

回答

7

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

3

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

+6

哇。许多犯罪行为都是“为了可读性”而做出的,其中突出的是编写长而复杂的代码,而不是简明扼要的代码。这与可读性相反。 – 2010-09-20 11:18:37

+0

有趣我使用第二个可读性。只是去显示可读性是主观的 – 2010-09-20 11:18:59

+1

@Konrad,长不会自动平等复杂。短不等于可读。 RegEx让人想起......事实是,“更长”的方式更紧密地遵循C#中其他所有工作的方式。较短的方式可能会让人困惑。我几乎不会调用CalculationHandler sumHandler1 = new CalculationHandler(math.Sum);犯罪。 – colithium 2010-09-21 10:00:03

0

两种方式都行,短版本只是C#编译服务。第一种方法更详细,并显示发生了什么。两个版本都产生相同的IL代码,这实际上接近于第一个版本。

1

两者都是正确的。

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

第一个更清楚地显示实际发生的情况,第二个更少代码,所以它更容易阅读(一旦你明白了实际发生的事情)。

1

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

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

相关问题