代码之家  ›  专栏  ›  技术社区  ›  Moe Sisko

属性应该与其类型同名吗?

  •  65
  • Moe Sisko  · 技术社区  · 17 年前

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

    public class B1
    {
    }
    
    public class B2
    {
        private B1 b1;
    
        public B1 B1
        {
            get { return b1; }
            set { b1 = value; }
        }
    }
    

    即,b2类具有名为“b1”的属性,该属性也属于“b1”类型。

    我直觉告诉我这不是一个好主意,但有什么技术上的原因,为什么你应该避免给一个属性与它的类同名?

    (我正在使用.NET 2.0,以防出现问题)。

    9 回复  |  直到 13 年前
        1
  •  60
  •   jason    17 年前

    很好。这里的典型例子是

    public Background {
        public Color Color { get; set; }
    }
    

    这里有一些罕见的问题(角落案件),但不足以保证避免这种设备。坦白地说,我觉得这个设备很有用。我不喜欢不能这样做:

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

    我不想说 Ticker StockTicker 或 Ticker ThisTicker 等。

        2
  •  15
  •   Dan Diplo    14 年前

    这个 Microsoft Naming Guideline for Members 状态:

    考虑为属性赋予与其类型相同的名称。

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

    尽管我承认,对于枚举或一般属性,它们只是建议这样做,还是有点含糊不清。

        3
  •  11
  •   MiffTheFox    17 年前

    我只能想到一个缺点。如果你想这样做:

    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属性重叠,因此表单事件必须使用完整的命名空间访问静态成员。

        4
  •  9
  •   SolutionYogi Eric Lippert    17 年前

    就在今天,埃里克在博客上提到了“颜色”的问题。

    http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx

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

        5
  •  3
  •   Mehrdad Afshari    17 年前

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

        6
  •  3
  •   Chris    17 年前

    另一种方法是使用内部类型。

    我经常碰到这个:

    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;
        }
    }
    
        7
  •  1
  •   Guffa    17 年前

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

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

        8
  •  1
  •   Annabelle    16 年前

    这种常见的模式是我经常使用的原因之一 this 当引用类中的实例成员时。例如总是

    this.SomeMethod(this.SomeProperty);
    

    永不

    SomeMethod(SomeProperty);
    

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

        9
  •  0
  •   ChrisW    17 年前

    我给事物取了与它们类型相同的名称,除了大小写:我的方法和属性是“小写的”;因此我不会遇到mifffox所具有的问题。

    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 是类的名称。