属性是否应与其类型相同?

Moe*_*sko 66 .net c# naming-conventions

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

public class B1
{
}

public class B2
{
    private B1 b1;

    public B1 B1
    {
        get { return b1; }
        set { b1 = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

即,B2类具有名为"B1"的属性,其也是"B1"类型.

我的直觉告诉我这不是一个好主意,但有什么技术原因可以避免给出与其类同名的财产吗?

(我正在使用.net 2.0,以防万一).

jas*_*son 61

没关系.这里的典型例子是

public Background {
    public Color Color { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这里出现了罕见的问题(极端情况),但还不足以避免使用此设备.坦率地说,我发现这个设备非常有用.我不喜欢无法做到以下几点:

class Ticker { ... }


public StockQuote {
    public Ticker Ticker { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我不想不得不说Ticker StockTicker还是Ticker ThisTicker等等.

  • `class A {public static void Method(int i){} public void Method(object o){}}`和`class B {AA {get; 组; } public B(){A = new A(); A.Method(0); }.是`A.Method`调用名为`Method`的静态方法还是调用名为`Method`的实例方法?(在C#中,它会调用静态方法.但是,如果你将`A.Method(0)`中的`0`替换为`"Hello,world!"`它将调用实例方法.注意Intellisense没有选择它,并将突出显示`A.Method("Hello,world!")``中的`A`,就好像它是静态方法一样.) (12认同)
  • 角落案件有哪些? (3认同)
  • 并且这仅仅是指出可能存在(罕见的)情况,其中使用该模式的代码的意图不清楚(当然,总是存在基于语言规范的明确解释). (2认同)

Dan*_*plo 16

成员Microsoft命名指南声明:

考虑给一个属性与其类型相同的属性.

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

虽然我承认他们是否只是为Enums或一般属性推荐这个有点含糊不清.


Mif*_*Fox 11

我只能想到一个缺点.如果你想做这样的事情:

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

你必须改为使用:

MyNamespace.B1.MyFunc();
Run Code Online (Sandbox Code Playgroud)

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


Sol*_*ogi 9

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

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

就个人而言,如果可能,我会尽量避免.

  • 为什么?我认为没有任何伤害. (4认同)
  • **他的文章实际显示的是,让*static*和*instance*成员具有相同名称是愚蠢的.**我希望任何程序员都能避免.请注意这个关键句子"*在实际情况中,实例和静态方法通常具有不同的名称*".请注意,问题都出现了,因为他声明了`静态M`和(实例)`M`.对"颜色颜色"的讨论只是表明*将*`颜色颜色'与"静态M"和"M"结合起来会使问题变得更糟.所以不要做原来的白痴. (3认同)

Chr*_*ris 6

另一个问题是内部类型。

我一直遇到这个:

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

  • 这就是为什么我将我的枚举名称复数化。汽车有多种可能的“品牌”,但这款车只有一个“品牌”。它并不总是读得最好,但我认为枚举是可能的`Makes`列表。 (5认同)