c# - 方法书写模式

标签 c# delegates

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

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

这和老式的方式一样

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

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

最佳答案

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

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

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

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

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

关于c# - 方法书写模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2213730/

相关文章:

ios - 选择器没有已知的实例方法 'receivedItemsJSON'

c# - 当属性是委托(delegate)类型时,如何在 C# 中使用反射设置属性值?

c# - ASP.NET MVC5 Google APIs GoogleWebAuthorizationBroker.AuthorizeAsync 在本地工作但未部署到 IIS

c# - .NET4.5 中异步 POST 方法的 HttpResponseMessage 异常

c# - 如何在 C# 中实现 ORM

java - 自定义 slider UI Swing

swift - 关闭 ViewController 并重新加载以前的数据/传回数据?

c# - 使用 C# 在文本中插入制表符

javascript - 如何使用 ServerOperation 获取 Kendo Grid 项目的页面

c# - 为什么 .net 委托(delegate)赋值运算符没有将引用分配给原始委托(delegate)?