Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何命名递延(收益)与常规IEnumerable<;T>;扩展方法?_C#_.net_Naming Conventions_Naming - Fatal编程技术网

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后缀来指定方法不会立即返回。然而,我对这样的命名不满意,有没有更好的方法、惯例或最佳实践?

我不相信有一个命名这种方法的“官方”惯例。任何约定都必须由您定义(就像您所做的那样),并传达给您的团队

也就是说,有两种更简单的方法可以实现目标,而无需定义任何内容:

  • 作为惯例,请按返回类型区分它们。所有立即执行的方法的实现通常将打包一个已知的数据类型以返回;e、 g
    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);
      }
    }