.NET集合命名约定

MrE*_*ndo 16 .net c# naming-conventions

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

例如:

类产品 - 集合 - 类产品

要么

类产品 - 集合 - 类ProductCollection

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

哪个是正确的?

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

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

And*_*are 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; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

class Ball { }

class BallCollection
{
    public String Color { get; set; }
    public String Material { get; set; }
    public IList<Ball> Balls { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

  • @MrEdmundo:啊哈,我明白了.在那种情况下,我会使用ProductCollection.需要注意的一点是:通过合成方式可以更好地解决问题吗?换句话说,如果它包含*一个`List <Product>`而不是继承它,那么管理/扩展你的类型可能会更容易. (4认同)

Phi*_*ert 21

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

显然,产品不适合该方案.ProductCollection做:

插图:

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

var products = new ProductCollection(); // products is a ProductCollection
Run Code Online (Sandbox Code Playgroud)

哪一个"听起来不错"?

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

例如:

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

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


Ran*_*pho 6

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


Svi*_*ish 5

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

public void GetSomething(out object retVal) 
{
    retVal = ThingFactory.CreateSomething();
}
Run Code Online (Sandbox Code Playgroud)

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

如果改为"命名返回变量",你的意思是这样的:

var retVal = ThingFactory.CreateSomething();
Run Code Online (Sandbox Code Playgroud)

然后我会说根据它是什么来命名变量.它将被用于什么.如果是汽车清单,请拨打电话listOfCars,如果是以后要吃的面包,请拨打电话pieceOfBreadpieceOfBreadToBeEatenLater.

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