C# 如何命名递延(收益)与常规IEnumerable<;T>;扩展方法?
如果C# 如何命名递延(收益)与常规IEnumerable<;T>;扩展方法?,c#,.net,naming-conventions,naming,C#,.net,Naming Conventions,Naming,如果IEnumerable扩展方法是derred而不是立即可执行的,那么是否有一种标准的做法来为它们的名称添加适当的后缀或前缀。这是需要的,因此方法的用户立即知道它是否将被延迟执行 示例(仅说明要点并解释我所说的内容,不要认为这些是代码中使用的实际精确方法): public静态IEnumerable DoSomething(此IEnumerable项,Func转换){ var list=新列表(); foreach(项目中的var项目){ 列表。添加(转换(项目)); } 退货清单; } 公共静
IEnumerable
扩展方法是derred而不是立即可执行的,那么是否有一种标准的做法来为它们的名称添加适当的后缀或前缀。这是需要的,因此方法的用户立即知道它是否将被延迟执行
示例(仅说明要点并解释我所说的内容,不要认为这些是代码中使用的实际精确方法):
public静态IEnumerable DoSomething(此IEnumerable项,Func转换){
var list=新列表();
foreach(项目中的var项目){
列表。添加(转换(项目));
}
退货清单;
}
公共静态IEnumerable DoSomethingDeferred(此IEnumerable项,Func转换){
foreach(项目中的var项目){
收益率-收益率转换(项目);
}
}
在上面的示例中,我添加了Deferred后缀来指定方法不会立即返回。然而,我对这样的命名不满意,有没有更好的方法、惯例或最佳实践?我不相信有一个命名这种方法的“官方”惯例。任何约定都必须由您定义(就像您所做的那样),并传达给您的团队 也就是说,有两种更简单的方法可以实现目标,而无需定义任何内容:
List
/IList
、数组、HashSet
等。只需返回该类型。这样,一旦API的返回类型是IEnumerable
,使用者就会知道它的延迟执行;否则,就是立即执行如果您查看标准LINQ操作,您将看到通常不存在同一操作的延迟版本和即时版本,您将看到可以延迟执行的操作(
Where
,Select
等)被延迟执行。基本规则是,如果某件事可以推迟做,那就推迟做
通常,什么是推迟的,什么不是,这是非常清楚的。如果它返回一个IEnumerable
,它很可能被延迟。如果它返回其他内容,则不能延迟
所以我想说,你不需要后缀或前缀,我也不认为有一个“标准”的。无论如何,您都不需要它们,因为您很少需要编写相同方法的两个版本。请考虑,要想得到一个好的名称是一种代码味道。它做得太多了,而且很危险。将DontEverUseBreak包括在名称中是合适的广告,但你只会在一段时间后发现。对不起,我不太明白如何想出一个好的名称是一种代码气味?相反,它将提高可读性和维护性,因为它非常清楚该方法的作用。它还将加快开发速度,因为这种实用方法的使用者将能够一目了然地知道他们的行为,并选择最适合用例的方法。我倾向于使用“Iterate”作为迭代器函数(包含yield)和“Get”的前缀(即“IterareTransform”)为我准备的收藏品。此外,我倾向于返回表达我所给出内容的限制最小的界面(即,如果用户添加到该界面有意义,则返回
IList
;如果我将T的构造函数设置为内部的,或确保返回的列表包含所有内容,则返回IReadOnlyList
),但在某些情况下,您希望同时拥有两个版本。有时不清楚哪个是哪个。我给出的示例只是一个示例,有点做作,只是为了说明这一点。@FitDev如果您确实觉得需要两种方法,请将其命名为XXXDeferred
或您和您的团队同意的任何其他方法。据我所知没有一个标准。谢谢你的建议。但是#1不能很好地与Intellisense和重载解析配合使用(方法需要有不同的参数签名或名称)。评论当然很好,也很简单,但我特别想找一个命名建议(Deferred只是一个我不喜欢的例子,因为它太长了)。
public static IEnumerable<TOut> DoSomething<TIn, TOut>(this IEnumerable<TIn> items, Func<TIn, TOut> transform) {
var list = new List<TOut>();
foreach (var item in items) {
list.Add(transform(item));
}
return list;
}
public static IEnumerable<TOut> DoSomethingDeferred<TIn, TOut>(this IEnumerable<TIn> items, Func<TIn, TOut> transform) {
foreach (var item in items) {
yield return transform(item);
}
}