2013-05-12 91 views
2

除了調用具有很多參數的方法(並且可能支持.NET 3.5前代碼),是否有任何理由來定義自定義委託而不是僅使用Func和Action?是否有任何理由來定義自定義代表?

+1

當然,公共標識符應該有很好的描述性名稱。 – 2013-05-12 10:34:03

回答

1

在功能上並不是真的。在可讀性方面,我能想象的唯一事情就是更加明確。請看下面的例子:

public delegate void MessageHandler(string msg); 

// user custom delegate 
public sub DoSomething(MessageHandler handler){} 

// use generic action 
public sub DoSomething(Action<string> handler){} 

您可以在這裏看到的第一個版本是更爲明確,因爲它準確地定義什麼是預期的,因此您的客戶端代碼將更具可讀性:

DoSomething(new MessageHandler(somefunc)); 

DoSomething(msg => ...); 
1

在現代的C#代碼,你是對的,很少需要創建一個自定義委託。對於C#4,我只會創建一個自定義代理:

  • 當有多個參數時,爲了提高可讀性和自我記錄。
  • 如果委託人的姓名可以向API的用戶傳遞意思
  • 也許對於某些P/Invoke操作,現在不能想到任何權利。

爲什麼你會看到在.NET代碼庫中一些定製代表的原因是,大部分是被設計相當早,在C#是版本1,也沒有匿名委託,lambda表達式或仿製藥。因此,大多數需要委託類型的操作都需要自定義委託。

2

目前尚未提及的一個方面是FuncAction不支持refout參數。不過,代表們可以擁有它們。