【问题标题】:C# method naming conventions: ToSomething vs. AsSomethingC# 方法命名约定:ToSomething 与 AsSomething
【发布时间】:2015-08-07 10:43:49
【问题描述】:

当我为我的业务逻辑对象编写一些扩展方法时,我遇到了重命名转换方法的问题。 someObject.ToAnotherObject() 可以与广泛使用的 object.ToString() 搭配使用。

但是,例如,LINQ 混合了这两种变体,我找不到它们之间的区别。 ToDictionary(), ToList(), AsParallel(), AsQueryable(), ...

这两种命名约定有什么区别?我应该知道什么来决定是否将其用于我自己的类?

【问题讨论】:

    标签: c# naming-conventions


    【解决方案1】:

    ToDictionaryToListTo 为前缀,因为它们不一定保留原始集合的结构标识或其属性。

    • List<T> 转换为 Dictionary<K, V> 会创建一个具有全新结构的集合。
    • HashSet<T> 转换为 List<T> 会删除集合的唯一性属性。

    As 为前缀的方法不会做任何这些事情——它们只是提供原始集合的替代视图。他们丰富了它。

    【讨论】:

    • 所以,在苹果上我可以调用.AsCleanApple(),因为我只需要清洗它,而.ToFruitSalad(),因为我的刀会改变苹果的结构‽
    • @Physikbuddha 基本上,是的。
    • @Physikbuddha 在我看来,AsCleanApple改变苹果的一些东西。一个更好的类比可能是AsFruit
    • .AsCleanAppleSource() 会将苹果的来源变成干净的苹果来源;如有必要,增加一个清洗步骤,但也许什么都不做,苹果已经知道是干净的。 .ToPunnet() 将访问该来源并为您提供一盒苹果。
    • 严格来说这不是真的,但一般情况下,您可以将“AsXXX()”视为强制转换,将“ToXXX()”视为转换。
    【解决方案2】:

    在 Linq 中,ToXXX 方法都执行查询并从结果中创建一个新对象,而 AsXXX 方法产生一个在某些方面不同的新查询。它可能是同一个对象,但通过不同的接口访问(AsEnumerable() 这样做)或者它可能是一个改变功能的新对象(其他方法这样做,尽管有些检查它们是否可以只返回给定的对象,例如AsQueryable() 将返回source,如果它已经实现了IQueryable<T>,否则创建一个新的EnumerableQuery<TElement>

    【讨论】:

    • that alters how the functionality - how 是不必要的还是应该在声明的下一部分?
    • @Kapol 不,只是同时写字和打字造成的错字。
    • 我认为这是正确的答案,即原始实例的活动与静态投影。 ToXXX() 投影与原始数据无关的数据。 AsXXX() 与原始文件保持着积极的关系(至少在我们正在讨论的 Enumerable/Queryable 示例中)。
    • +1 表示 ToXXX execute the queryAsXXX produce a new query。从我在 LINQ 和 MSDN seems to confirm for ToXXX 上读到的内容听起来不错,但我想知道是否有人知道 all AsXXX 方法是否被延迟执行?
    • @brichins 甚至有一种有意义的方式来表达“全部”,因为我们中的任何一个人都可以与一个新的提供者一起出现,该提供者在 Linq 固有的那些之上添加一个新的AsXXX(例如。 PLinq 添加的AsParallel,Entity Framework 提供的AsNoTracking,等等)。当然,linq 的核心是由QueryableEnumerable 定义的,这两个类都遵循该约定。大多数补充都是为了,在某种程度上,“全部”可能是正确的,但它太开放了,无法保证总是正确的(尽管我认为任何中断都是设计缺陷)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多