我有时会看到这样编写的代码:
public class B1
{
}
public class B2
{
private B1 b1;
public B1 B1
{
get { return b1; }
set { b1 = value; }
}
}
即。 B2类具有名为“B1”的属性,其类型也为“B1”。
我的直觉告诉我这不是一个好主意,但有没有技术上的理由说明为什么你应该避免给一个与其类同名的财产呢?
(我正在使用.net 2.0,如果重要的话)。
答案 0 :(得分:60)
没关系。这里的规范示例是
public Background {
public Color Color { get; set; }
}
这里出现了罕见的问题(极端情况),但还不足以避免使用此设备。坦率地说,我发现这个设备非常有用。我不喜欢无法做到以下几点:
class Ticker { ... }
public StockQuote {
public Ticker Ticker { get; set; }
}
我不想说Ticker StockTicker
或Ticker ThisTicker
等。
答案 1 :(得分:16)
Microsoft Naming Guideline for Members州:
考虑为属性提供与其类型相同的名称。
如果您有一个强类型的枚举属性,则该属性的名称可以与名称相同 枚举。例如,如果您有一个名为的枚举
CacheLevel
,返回其中一个值的属性也可以 名为CacheLevel
。
虽然我承认他们是否只是为Enums或一般属性推荐这个有点含糊不清。
答案 2 :(得分: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();
}
}
你必须使用:
MyNamespace.B1.MyFunc();
一个很好的例子是在Winforms编程中常见的用法,其中System.Windows.Forms.Cursor类与System.Windows.Forms.Form.Cursor属性重叠,因此表单事件必须使用静态成员访问完整的命名空间。
答案 3 :(得分:9)
就在今天,Eric发表了关于'Color Color'问题的博文。
http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx
就个人而言,如果可能,我会尽量避免。
答案 4 :(得分:3)
它没有具体的技术问题。它可能会损害或提高可读性。事实上,一些Microsoft库具有这些属性(特别是具有enum
属性,这通常是有意义的。)
答案 5 :(得分:3)
另一个问题是内在类型。
我一直遇到这个:
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;
}
}
答案 6 :(得分:1)
当一个属性的名称和它的类型相同时,显然会有点混乱,但除此之外它不是真正的问题。
如果名称有意义,通常最好让名称和类型相同。如果你能想到一个更好的名字,你当然应该使用它,但你不应该为了避免这种情况而不惜一切代价来编造一个名字。
答案 7 :(得分:1)
这种常见模式是我在引用类中的实例成员时始终使用this
的原因之一。例如总是
this.SomeMethod(this.SomeProperty);
永远不会
SomeMethod(SomeProperty);
在大多数情况下,没有任何实际的歧义,但我发现它有助于澄清事情。此外,您现在知道属性/方法的定义。
答案 8 :(得分:0)
我提供与其类型相同的名称,除了大小写:我的方法和属性是“lowerCase”;因此我不会有MiffTheFox的问题。
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
是类的名称。