c#命名惯例

时间:2013-02-22 14:43:08

标签: c# naming-conventions

我开始一个新项目,我在尝试实现一些命名约定时遇到了一些问题。

我曾经使用过以大写和单数形式开头的类,比如Car或User,以及以小写字母开头的变量,所以如果我需要声明一个类型为Car的类,那么我会像这样:

public Car car;
private User user;

现在我试图使用一些属性,因为我看到它们也应该是PascalCase,这意味着如果我需要声明相同的例子,我会:

public Car Car { get; set; }
private User User { get; set; }

你们都可以看到这里会出现什么问题,或者你们不认为这是一个问题?

那我该怎么办?我在这里失踪了什么?

6 个答案:

答案 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");
    }
}