方法编写模式

时间:2010-02-06 16:14:03

标签: c# delegates

我最近注意到以下代码基本上定义了一个类方法

public Func<string, string> SampleMethod = inputParam =>
{
    return inputParam.ToUpper();
};

与以旧式方式进行相同

public string SampleMethod(string inputParam ) 
{
    return inputParam.ToUpper();
}

我的问题 - 为什么我更喜欢第一个?我的眼睛可能更训练,更快地理解第二种风格。我发现它类似于SMS术语和普通旧英语之间的区别。

3 个答案:

答案 0 :(得分:6)

这两件事情根本不同。前者是委托类型的字段,而后者实际上是一种方法。我能想到的最小的区别是你可以在运行时动态修改第一个,并在第二个修复时为其分配另一个方法引用。

如果你的目的是为C#中的一个类编写一个简单的方法,你通常不应该优先选择第一个。

使第一个非常脆弱的例子:

var c = new SomeClass();
c.SampleMethod = inputParam => inputParam.ToLower();
c.DoSomeTaskThatReliesOnSampleMethodReturningAnUpperCaseString();
c.SampleMethod = null;
c.DoSomeTaskThatCallsSampleMethod(); // NullReferenceException

这种编程风格在Javascript这样的语言中很常见,其中一个对象基本上是一个建立在简单字典上的动态生物。

答案 1 :(得分:2)

它们实际上根本不相同。第二个是常规成员方法,它在输入字符串上返回ToUpper。

另一方面,第一个是Func成员变量,恰好指向一个实现相同功能的委托。但是,由于这是一个方法指针,因此您可以在运行时将委托替换为相同类型的任何其他委托。即您可以完全重新定义调用此方法的含义。

答案 2 :(得分:0)

第二种方式的一个好处是从单元测试角度来看更好 - 您可以测试您的类并知道该方法将正确返回大写字符串。使用第一种方法,您可以在运行时更改方法,因此单元测试要困难得多。