2012-02-27 69 views
2

如果我有一个相互关联的类中的常量,可以说用于为MyClass编写/读取Xml文件的字符串,是否应该将它们包装在MyClass中的嵌套类Xml中?或者只是定义它们而不包裹在MyClass中?如果包装它们比如果只有部分这些常量应该可以被外部世界访问是一个好主意,例如只有Xml.Name,其余的是MyClass将用于重新创建对象的Xml属性,那么我应该如何设置我的嵌套类的保护级别为?类特定常量是否应该包装在嵌套类中?

+0

我没有对是否应该使用嵌套类或没有意见,但如果你那么我应该认为嵌套类将是公共的,外部可见成员是公共内部成员和内部可见成员。 – allonym 2012-02-28 00:56:45

+1

请注意,可公开访问的常量可能会导致一些奇怪的情况。使用你的程序集的程序集可以自由地将常量嵌入到它们自己的二进制文件中。结果是,即使您更改了它可能不会反映在使用您的代码的程序集中的值(并且该代码使用了新构建版本)。因此,当你希望公开你的常量时,静态只读是个好主意(当然,内部不会导致这个问题) – 2012-02-28 14:57:57

回答

0

我看到一个nested-class作为一个对象,只有在另一个对象的上下文中才有意义;并且其逻辑需要该另一个对象的属性。鉴于此,我从未设计过我以后不会重构的nested-class。而且我认为需要一个public nested-class作为一个陷入困境的设计的红旗。

无论如何,你的问题让我考虑它们是否可能有用。所以即使我不会使用这种设计,它可能适用于你。

我确实想提到const应该只用于永不改变的事情。就像一天中的几小时或光速。我不能完全从你的问题中得知,但类似Xml.Name似乎是可变的。我建议对这些属性使用readonly。可能的话,static readonly如果它们在所有实例中都一致。这将导致你清除many pitfalls of const

以下是class我嘲笑了证明什么,我会建议为你的设计:

public class MyClass 
{ 
    public string Title { get; set; } 

    Xml _xml; 
    public Xml MyXml 
    { 
     get { return _xml; } 
     set { _xml = value; } 
    }  

    public MyClass(string xmlName, object xmlAttributes) 
    { 
     _xml = new Xml(xmlName, xmlAttributes);   
    } 

     public class Xml 
     { 
      private readonly string _name; 
      public string Name 
      { 
       get { return _name; } 
      } 

      private readonly object _attributes; 
      internal object Attributes 
      { 
       get { return _attributes; } 
      } 

      public Xml(string name, object attributes) 
      { 
       _name = name; 
       _attributes = attributes; 
      } 
     } 
} 
0

我看不需要将常量移动到嵌套类。

无障碍:只有MyClass的 *私人*需要
让常量。
仅使用与MyClass * internal *在相同程序集中的类所需的常量。
仅使用子常量MyClassMyClass本身保护
请常数仅由在相同组件MyClass的类或通过MyClass的亚类和由MyClass的本身内部保护需要。
Make常量也需要其他程序集中的类MyClass的一个public

命名:
如果你在一个类中使用前缀好很多常量类别他们。所以读者可以更快地找到正确的。

+0

通常不会公开常量。跨装配边界的常量可以是“有趣的”(请参阅​​问题的评论) – 2012-02-28 14:58:58

+0

好的,然后*公共静态只读*。 – brgerner 2012-02-28 15:47:03

+0

@RuneFS * * protected *和* internal protected *还需要* static只读*因为子类可以在其他程序集中。 – brgerner 2012-02-28 15:57:27