C#方法命名约定:ToSomething与AsSomething


82

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

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

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

Answers:


91

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

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

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


41
因此,在一个苹果我可以打电话.AsCleanApple(),因为我只需要洗它,.ToFruitSalad()因为我的刀将改变apple‽的结构
Physikbuddha

3
@Physikbuddha基本上是。
MKII

37
@Physikbuddha在我看来,这AsCleanApple改变苹果的某些情况。一个更好的比喻可能是AsFruit
dcastro,

4
.AsCleanAppleSource()会把苹果的来源变成干净苹果的来源;如果有必要,可以添加一个清洗步骤,但是也许什么也不做,这就是众所周知的苹果是干净的。.ToPunnet()会访问该来源并为您提供一篮苹果。
乔恩·汉娜

2
严格来说,这不是正确的,但总的来说,您可以将“ AsXXX()”视为转换,将“ ToXXX()”视为转换。
nateirvin

26

在Linq中,ToXXX所有方法都执行查询并从结果中创建一个新对象,而这些AsXXX方法产生一个新查询,该查询在某种程度上有所不同。它可以是相同的对象,但通过不同的接口访问(AsEnumerable()做到这一点),或者它可能是一个新的对象,改变功能(其他方法做到这一点,虽然一些检查,看看他们是否可以只返回给定对象,如AsQueryable()source如果已实现IQueryable<T>,则返回,EnumerableQuery<TElement>否则返回一个新值)。


that alters how the functionality-是how不必要的还是该声明的下一部分?
卡波尔2015年

@Kapol不,这是同时编写和键入所引起的错字。
乔恩·汉纳

我认为这是正确的答案,即原始实例的主动投影与静态投影。ToXXX()投影与原始数据无关的数据。AsXXX()保持与原始文件的有效关系(至少在我们正在讨论的Enumerable / Queryable示例中)。
蒂姆·梅多拉

ToXXX execute the query和+1 AsXXX produce a new query。从我在LINQ上阅读的内容来看,听起来似乎很正确,并且MSDN似乎证实了ToXXX,但是我想知道是否有人知道所有 AsXXX方法是否都推迟执行?
brichins

1
@brichins甚至可以通过一种有意义的方式来表示“全部”,因为我们中的任何人都可以与新的提供程序一起使用,AsXXX从而在Linq固有的基础之上添加新的功能(例如,AsParallel由PLinq添加的,AsNoTracking由实体框架提供的,等等)。当然,LINQ的核心是什么,是通过定义QueryableEnumerable,和这两个类都遵循该公约。大多数添加都在某种程度上做到了“全部”可能是正确的,但是它太开放了,不能保证总是正确的(尽管我会考虑打破任何设计缺陷)。
乔恩·汉娜
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.