.NET集合命名约定

时间:2009-07-14 15:39:19

标签: c# .net naming-conventions

我的同事和我一直在讨论应该叫什么集合。

例如:

类产品 - 收藏 - 类产品

类产品 - 集合 - 类ProductCollection

我已经四处看看,看看我是否可以看到使用其中一个的任何指导方针或原因,但似乎没有任何东西出现。例如,框架似乎使用两种变体。我可以看到的论点是,具有products变量集合的类应该被称为Products,但它应该是ProductCollection类型。

哪个是正确的?

在同一个叶片中有一个标准,用于命名函数的返回变量。例如retVal的?

我们主要用C#编码,虽然我不确定这会影响我的问题。

5 个答案:

答案 0 :(得分:44)

我想说,对于泛型,很少有理由创建自定义集合类型。但是如果你必须我会说ProductCollection最适合框架的命名约定。

不过,请考虑使用List<Product>Collection<Product>或更好但IList<Product>ICollection<Product>

编辑: 这是对MrEdmundo在下面的评论的回应。

在您的情况下,您有两个选择。最明显的选择是使用这样的继承:

class Ball { }

class BallCollection : List<Ball>
{
    public String Color { get; set; }
    public String Material { get; set; }
}

我说得很明显,因为它似乎似乎乍一看是最好的主意,但经过一番思考后,很明显这不是最好的选择。如果您或Microsoft创建新的SuperAwesomeList<T>并且您希望使用它来提高BallCollection课程的效果,该怎么办?这很困难,因为你通过继承绑定到List<T>类,更改基类可能会破坏使用BallCollection作为List<T>的任何代码。

那么什么是更好的解决方案?我建议在这种情况下,你最好支持组合而不是继承。那么基于组合的解决方案会是什么样的呢?

class Ball { }

class BallCollection
{
    public String Color { get; set; }
    public String Material { get; set; }
    public IList<Ball> Balls { get; set; }
}

请注意,我已将Balls属性声明为IList<T>类型。这意味着只要该类型实现IList<T>,您就可以使用您希望的任何类型自由地实现该属性。这意味着您可以在任何时候自由使用SuperAwesomeList<T>,这使得此类型的可扩展性更高,维护更少痛苦。

答案 1 :(得分:21)

产品肯定不正确恕我直言。非静态类名应该代表名词(不是复数),因为你应该可以说“ x是[classname] ”。

显然,产品不适合该计划。 ProductCollection 可以:

插图:

var products = new Products(); // products is a Products

var products = new ProductCollection(); // products is a ProductCollection

哪一个“听起来不错”?

关于命名集合类的另一件事:我通常尝试以这样的方式命名集合类,以便清楚它是什么类型的集合。

例如:

  • class ProductCollection :只能枚举并检索Count(即只实现ICollection接口)
  • class ProductList :可以使用Add(),Insert()等操作的列表(即实现IList接口)
  • class ProductDictionary :某些键可访问的产品词典(即实现IDictionary接口)

如果对字典的键是什么有疑问,那么最后一个可能是不明确的,因此最好指定键类型是什么(如ProductDictionaryByString)。但说实话,我很少用这种方式命名,因为大多数时候密钥都是字符串。

答案 2 :(得分:6)

.NET Framework经常为其集合类型使用“Collection”后缀。 StringCollection,ObservableCollection,KeyedCollection等。所以请使用ProductCollection。

答案 3 :(得分:5)

注意到没有人回复你的retVal(或者我可能会失明)。虽然我不是专家;关于retVal问题的问题,我不是100%肯定“返回变量的命名”是什么意思,但如果你的意思是这样的话:

public void GetSomething(out object retVal) 
{
    retVal = ThingFactory.CreateSomething();
}

我想说,无论约定是什么,都不要这样做。这很烦人。只需返回值即可。如果你需要返回多个东西,那么我认为该方法要么做不止一件事(一个方法不应该),要么这些东西应该包含在某种可以返回的逻辑类中。< / p>

如果用“命名返回变量”代替这样的东西:

var retVal = ThingFactory.CreateSomething();

然后我会根据它的名称命名变量。它将被用于什么。如果是汽车列表,请将其称为listOfCars,如果它是以后要吃的面包,请将其称为pieceOfBreadpieceOfBreadToBeEatenLater

希望有所帮助,并且它离某个地方不远:p

答案 4 :(得分:2)

<强> Thesaurus.com

不要再犹豫了。你不再会考虑多元化的奇点。只需将其中一个复数保护器固定到您的对象名称上即可:

  • 混乱
  • 采空区
  • 特罗韦
  • 翻译
  • 加载
  • 集聚
  • 土墩
  • 系列
  • 词典
  • 穆斯特尔
  • 词汇表
  • 囤积居奇
  • 群集
  • 康宏
  • 缝合 -
  • 畜群
  • 暴民
  • 批量
  • Amassment
  • 银行
  • 预订
  • 汇编
  • 羊群
  • 陆军

让它变得有趣。