C#方法命名约定:ToSomething vs. AsSomething

Phy*_*dha 81 c# naming-conventions

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

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

这两个命名约定之间有什么区别,我应该知道如何决定是否使用我自己的类?

dca*_*tro 91

ToDictionary并且ToList以前缀为前缀,To因为它们不一定保留原始集合或其属性的结构标识.

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

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

  • 所以,在一个苹果上我可以调用`.AsCleanApple()`因为我只需要洗它,然后`.ToFruitSalad()`因为我的刀会改变苹果的结构‽ (41认同)
  • @Physikbuddha在我看来,像'AsCleanApple`将*改变*关于苹果的东西.更好的类比可能是"AsFruit" (37认同)
  • `.AsCleanAppleSource()`会将苹果来源变成干净苹果的来源; 如果有必要,可以添加一个洗涤步骤,但也许什么都不做,苹果已经知道是干净的.`.ToPunnet()`会访问该源并给你一个苹果的短网. (4认同)
  • @Physikbuddha基本上,是的. (3认同)
  • 这不是严格意义上的,但一般来说,您可以将"AsXXX()"视为转换,将"ToXXX()"视为转换. (2认同)

Jon*_*nna 26

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