C# 属性是否应与其类型具有相同的名称?

C# 属性是否应与其类型具有相同的名称?,c#,.net,naming-conventions,C#,.net,Naming Conventions,我有时会看到这样编写的代码: public class B1 { } public class B2 { private B1 b1; public B1 B1 { get { return b1; } set { b1 = value; } } } i、 e.B2类有一个名为“B1”的属性,也是“B1”类型 我的直觉告诉我这不是一个好主意,但是有没有什么技术原因可以让你避免给属性起与其类相同的名字 (我用的是.NET2.0,

我有时会看到这样编写的代码:

public class B1
{
}

public class B2
{
    private B1 b1;

    public B1 B1
    {
        get { return b1; }
        set { b1 = value; }
    }
}
i、 e.B2类有一个名为“B1”的属性,也是“B1”类型

我的直觉告诉我这不是一个好主意,但是有没有什么技术原因可以让你避免给属性起与其类相同的名字


(我用的是.NET2.0,以防万一)。

就在今天,Eric在博客中谈到了“颜色”问题


就我个人而言,如果可能的话,我会避免这样做

它没有具体的技术问题。它可能会损害或提高可读性。事实上,一些Microsoft库具有此类属性(具体来说,对于
enum
属性,这通常是有意义的)。

这很好。这里的典型例子是

public Background {
    public Color Color { get; set; }
}
这里出现了一些罕见的问题(角落案例),但不足以保证避免使用该设备。坦率地说,我觉得这个设备很有用。我不喜欢不能做到以下几点:

class Ticker { ... }


public StockQuote {
    public Ticker Ticker { get; set; }
}

我不想说股票代码或股票代码等等。我只能想到一个缺点。如果你想做这样的事情:

public class B1
{
        public static void MyFunc(){ ; }
}

public class B2
{
        private B1 b1;

        public B1 B1
        {
                get { return b1; }
                set { b1 = value; }
        }

        public void Foo(){
                B1.MyFunc();
        }
}
您必须使用:

MyNamespace.B1.MyFunc();

这方面的一个很好的例子是在Winforms编程中,System.Windows.Forms.Cursor类与System.Windows.Forms.Form.Cursor属性重叠,因此表单事件必须使用完整名称空间访问静态成员。

当属性的名称和类型相同时,显然会有点混淆,但除此之外,这不是一个真正的问题


如果名称有意义,通常最好让名称和类型相同。如果你能想出一个更好的名字,你当然应该使用这个名字,但你不应该为了避免这种情况而不惜任何代价去拼凑一个名字。

我给事物起的名字和它们的类型相同,除了case:我的方法和属性是“小写”;因此,我不会有米夫特福克斯那样的问题

public class B1
{
    public static void myFunc(){ ; }
}

public class B2
{
    private B1 m_b1;

    public B1 b1
    {
        get { return m_b1; }
        set { m_b1 = value; }
    }

    public void Foo()
    {
        B1.myFunc(); //this is Ok, no need to use namespace
    }
}

所以对我来说,
m_b1
是成员数据,
b1
是属性(或局部变量或参数),
b1
是类的名称。

另一个问题是内部类型

我一直都会遇到这个问题:

public class Car {
    public enum Make {
        Chevy,
        Ford
    };

    // No good, need to pull Make out of the class or create
    // a name that isn't exactly what you want
    public Make Make {
        get; set;
    }
}

这种常见模式是我在引用类中的实例成员时总是使用
This
的原因之一。e、 g.总是

this.SomeMethod(this.SomeProperty);
永远不会

SomeMethod(SomeProperty);
在大多数情况下,没有任何实际的歧义,但我发现它有助于澄清问题。另外,您现在知道属性/方法的定义位置。

状态:

考虑为属性指定与其类型相同的名称。

当您具有强类型为枚举的属性时,该属性的名称可以与枚举的名称相同 枚举。例如,如果您有一个名为
CacheLevel
,返回其值之一的属性也可以 命名的
CacheLevel


尽管我承认,他们只是在为枚举或一般属性推荐这种方法,但还是有点模棱两可。

为什么?我看不出它有什么坏处。@StevenSudit在我看来,它增加了程序员的复杂性(毕竟,你需要阅读这篇文章才能理解发生了什么),我们程序员知道这有多糟糕&容易出错。他的文章实际上表明,让静态成员和实例成员同名是愚蠢的。我希望任何程序员都能避免。注意这句关键的句子“在实际情况中,实例和静态方法通常有不同的名称”。请注意,所有问题都是因为他声明了
static M
和(instance)
M
。对
Color-Color
的讨论表明,将
Color
static M
M
相结合会使问题变得更糟。所以不要做最初的白痴。不幸的是,对属性和方法使用小写与公认的C#命名准则直接冲突。是的。它们是劣质的指导方针,依我看,你不同意吗?为什么会这样?这是一种权衡,即最大限度地清晰/最小化误解。考虑一个典型的代码文件。计算所有类名、成员名和局部变量名的所有外观。您会发现类名只占命名项总外观的一小部分。因此,您的选择为绝大多数名称外观指定“小写”。因此,您为区分“类”和“非类”指定了一个较高的值。这没什么错,但推荐的样式将“本地”与“非本地”区分开来。也许以相反的方式失去平衡…我相信.NET框架设计指南也推荐这种命名约定。哪种命名约定-将它们称为相同的东西,或者改变区分的大小写?
class A{public static void Method(int I){}public void Method(object o){}
class B{A{get;set;}public B(){A=new A();A.Method(0);}}
.Is
A.Method
调用名为
Method
的静态方法,还是调用名为
Method
的实例方法?(在C#中,它将调用静态方法。但是,如果将
A.Method(0)
中的
替换为
“你好,世界!”
它将调用实例方法。请注意,Intellisense不会选择该方法,而是在
A.method(“你好,世界!”)中突出显示
A
蓝色,就像它是静态方法一样。),这只是为了指出可能存在(罕见的)使用此模式的代码意图并不十分清楚的情况(当然,基于语言规范总是有明确的解释)。@jason属性我同意,但对象为什么?您不想区分静态(类)方法调用和实例调用吗?如果您有一个对象,我看不出任何原因