我有一个名为SerializableString
的类,它扩展了基类CustomXmlSerializable
。基类提供了XML序列化和反序列化派生类的方法。
public class SerializableString : CustomXmlSerializable
{
public string String { get; set; }
}
显然,我可以将string
属性称为我想要的任何内容。但是因为这个类本质上是如此通用,所以给它一个非常明显的名称如“String”会很好。这样,该属性可以访问:
SerializableString userName = new SerializableString();
userName.String = "khargoosh";
编译器允许这样做。尽管有阶级和财产的性质,但是,如果将该类别中的唯一财产命名为“字符串”,那么将其视为不良做法或危险吗?
答案 0 :(得分:4)
不要这样做,即使它在编译器方面有效。 Eric Lippert的Color Color
示例不同 - 大多数事物很少有多个颜色属性,因此命名属性Color
通常会告诉您需要知道的有关该属性的所有信息。我称之为有效的情况,使用类型名称(Color
)可以用作属性的名称。 (有人可能会争论这是否是一个好的论据,但在过去我必须处理这个确切的问题并最终使用Color Color
。)
如果string String
你没有从属性名称中学到任何东西 - 给定的对象可能有(和对象经常这样做)几个string
类型的属性。命名属性String
并不会告诉您有关该属性的用途的任何信息。这使得代码更难理解。
这只是个人观点 - 正如另一个答案所指出的,这在语法上是有效的。最后,这是一个判断调用 - 我尽量避免在其类型后命名属性。更长,独特的属性/功能名称通常包含有关该符号的预期用途的更多信息。
特别针对此问题,我要调用属性Value
:
public string Value { get; set; }
答案 1 :(得分:1)
正如Eric Lippert自己所说here,这是完全可以接受的做法; C#语言经过精心设计,因此合法且实用。"
此外,在这种情况下,您的String属性意味着什么似乎是明确的:您有一个类似字符串的类,但可序列化,并且此属性返回基础字符串。实际上假设str
不是原始类型,原始类型是str
或其他类型。那么在我看来,在调用这个属性(你的类的中心属性)时会出现任何问题或含糊不清,而且#34; String" (在我的假设案例中返回类型为currency
)