我开始一个新项目,我在尝试实现一些命名约定时遇到了一些问题。
我曾经使用过以大写和单数形式开头的类,比如Car或User,以及以小写字母开头的变量,所以如果我需要声明一个类型为Car的类,那么我会像这样:
public Car car;
private User user;
现在我试图使用一些属性,因为我看到它们也应该是PascalCase,这意味着如果我需要声明相同的例子,我会:
public Car Car { get; set; }
private User User { get; set; }
你们都可以看到这里会出现什么问题,或者你们不认为这是一个问题?
那我该怎么办?我在这里失踪了什么?
答案 0 :(得分:9)
C#命名约定建议使用大写字母开头的所有公共内容以及类,接口等。其余的应该从小写开始。
没有问题:
private User User { get; set; }
...因为每个名字(单词)的位置定义了什么。 英语的工作方式相同。 例如:“我喜欢爱情。” (代词,动词,名词)
答案 1 :(得分:4)
您遇到的问题称为Color Color
问题,因为它最常见的方式是“我需要一个名为Color
的名为Color
的属性”。 C#专门设计用于优雅地管理Color Color
情况。
有关详细信息,请参阅C#4规范中的第7.6.4.1节“相同的简单名称和类型名称”。
Color Color
情况的规则有点复杂(相信我,它们不会使编译器实现者的生活变得更容易!)并且它们可能导致一些有趣的极端情况。如果这个主题让你感兴趣,那么你应该阅读我的文章:
http://blogs.msdn.com/b/ericlippert/archive/2009/07/06/color-color.aspx
答案 2 :(得分:2)
我认为在很多情况下,上下文意味着您有一个特定的名称 - 例如汽车客户汽车等 说,很多人没有名称/类型相同的问题 - 请看这个链接: Should a property have the same name as its type?
对于一般的命名约定,以下MS不是一个糟糕的开始 - http://msdn.microsoft.com/en-gb/library/vstudio/ms229045(v=vs.100).aspx
答案 3 :(得分:1)
那里没有问题。
因为在您使用该类的上下文中,它不能被误解为该属性,反之亦然。
编辑:好的,我会假设你在carclass中有这样的Userclass:
public class Car
{
private class User
{
}
private User User
{
get;
set;
}
}
确实会产生问题。移出您的用户,问题就解决了。
public class Car
{
private User User
{
get;
set;
}
}
public class User
{
}
答案 4 :(得分:1)
这里没有问题;正如@NDJ建议您可以应用上下文来为属性添加额外的前缀,如果您感觉不舒服;但这通常不会为上下文增加额外的含义。
作为一般的Microsoft风格指南,鼓励使用Pascal Case作为属性。
有关大小写的更完整指南,请参阅以下MSDN article
答案 5 :(得分:1)
除了@Evelie所指出的内部类问题,你应该没有任何问题,命名属性与类型相同 - 实际上这不是一种不常见的做法。 .NET在所有地方都有public Color Color
个属性。
如下面的程序所示,编译器可以区分实例调用和静态调用:
void Main()
{
Car c = new Car();
c.Test();
}
public class Car
{
public Car()
{
User = new User();
}
public void Test()
{
User.Static(); // calls static method
User.Instance(); // implies this.User
}
public User User { get; set; }
}
// Define other methods and classes here
public class User
{
public static void Static()
{
Console.WriteLine("Static");
}
public void Instance()
{
Console.WriteLine("Instance");
}
}