我应该选择Func<T, TResult>还是Converter<TIn, TOut>?

7

我正在编写一个带有类型参数T的类,该类接受将T实例转换为字符串的委托。我可以将这种委托的类型声明为Func<T,string>Converter<T,string>。有没有理由更喜欢其中之一?

4个回答

5
委托定义在除名称外几乎相同。 因此,它的真正价值在于防止将输入委托类型转换为您选择的类型时进行不必要的分配。 简而言之,如果所有输入委托都是 Func,选择 Converter 将导致您产生开销(反之亦然)。
总体而言,这只是一种风格上的决定。 我发现大多数新的API都更喜欢使用 Func Action 而不是其他命名委托,因此我会使用它们。

1
我认为你应该使用转换器,因为这是你的类所要求的:一个转换器。
当然,你可以使用Func,但是Func将会执行转换器的工作,因此如果你使用转换器,你的意图会更加清晰。

0

看起来这个问题以前已经被问过了。

根据转换器函数的文档,定义是等价的,所以我认为这是个偏好问题。

我个人会选择转换器,主要是因为它使您的意图更清晰(不仅仅是“传递一个委托”,而是“传递一个将转换某些内容的委托”)。

然而,如果它只是将任意对象转换为字符串,则.NET框架已经提供了一种机制:它称为.ToString,并且任何对象都应该有一个合理的实现。


1
Func<T,TResult> 在协变/逆变方面有什么不正确的地方? - Damien_The_Unbeliever
你说得对,应该也查一下Func的文档! - CompuChip
我已经更新了我的回答。虽然我必须承认JaredPar在他的回答中提出了一个很有力的观点。我们似乎都同意这是一个偏好问题,所以选择你认为更有说服力的论点吧。 - CompuChip
关于使用.ToString()机制,该类包括一个默认委托,如果没有给定Converter委托,则简单地调用T对象上的ToString()方法。如果TToString()方法不能产生所需的结果,则委托似乎是类的消费者指定自定义格式的好方法。 - Dan Stevens

0

转换器 的文档将其描述为被两个 ConvertAll 方法使用。

备注

这个委托被 ConvertAll<TInput, TOutput> 方法的 Array 类和 ConvertAll<TOutput> 方法的 List<T> 类使用,将集合中每个元素从一种类型转换为另一种类型。

我只会将它用于那个目的。对于其他任何目的,我会使用Func


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接