【问题标题】:Is anything good/bad/unnecessary about this use of a public member?使用公共成员有什么好的/坏的/不必要的吗?
【发布时间】:2010-09-29 02:16:03
【问题描述】:

这是我的代码的概要,它是一个中等复杂的 WinForms GUI。

依赖的上下文是模型视图展示器模式。

public class StatSyncherFormView : Form, IView 
{ ... }

public class Presenter 
{
   // Here is the member I made public
   public readonly IView view;

   public Presenter(IView view) 
   {
      this.view = view;
   }    
}

static void Main()
{
   IView view = new View();
   Presenter presenter = new Presenter(view);

   // Here is where I'm accessing the public member
   Application.Run((Form)p.view);   
}

1) 我喜欢视图仅由构造函数设置并且之后不会被修改的事实。它让我在多线程 GUI 开发环境中感觉更好。

2) 使用public View {get; private set;} 然后我输了(不变性?)。

3) 使用private readonly IView view,我还需要public View {get {return view;}},这感觉(至少对我来说,也许有人可以告诉我)是多余的。

我的问题:我觉得 (3) 是避免使用公共成员的唯一方法,但在这种情况下我不明白它的好处。

我知道这是细节问题,所以提前感谢任何花时间给我建议的人。

【问题讨论】:

    标签: c# .net-4.0 class-design


    【解决方案1】:

    只需给 Presenter 一个 Run() 方法。

    【讨论】:

      【解决方案2】:

      这实际上只是公开可见字段与属性辩论的变体。

      尽管您称之为“冗余”,但大多数人都会推荐遵循标准指南(您的选项 3)。顺便说一句,我不确定您所说的冗余是指以下哪一项

      • 需要输入一些额外的字符,或者

      • 运行时额外的 getter 方法(可能会被 JITter 优化掉)。

      在这两种情况下,“冗余”都不重要。

      话虽如此,在您的具体情况下,Hans Passant 的回答是完全避免对属性/字段的需要,这可能是最好的。

      【讨论】:

      • 对此进行快速跟进:C# 是否存在根本原因不允许类似“public P {get;}”之类的内容?
      • 根本原因是没有办法设置属性值,所以它总是有它的默认值(如果 P 是引用类型,则为 null)。
      • ... 但是我知道 Jon Skeet 曾经在某处说过他想看 'public P { get;私有只读集; }' 这会给你你想要的。一个不错的想法,但显然还没有达到包含在语言中的标准。
      • 是的,我试图暗示 'public P {get;}' 会产生错误,除非它在构造函数中被初始化并且与后面的只读字段具有相同的语义。总是很难弄清楚这些东西中包含多少/很少的细节:)
      • 无论如何,它似乎都在考虑之中 - 请参阅 Eric Lippert 对stackoverflow.com/questions/1050761/…的评论
      【解决方案3】:

      您的第三种方法(我最喜欢)的好处包括:

      • 您可以稍后在 getter 中添加逻辑,而无需重新编译调用代码
      • 封装:您的代码中只有一个位置从实际字段中获取值,允许您添加日志记录或使用任何其他调试机制来解决意外行为。
      • 封装还意味着您实际上可以将字段更改为保存其他类型,只要它可以转换为IView。这种转换可以发生在 getter 中。

      【讨论】:

        【解决方案4】:

        如果您使用公共字段,则以后如果不重新编译程序集就无法将其更改为属性。所以我认为最好一开始就使用属性。

        【讨论】:

          猜你喜欢
          • 2011-11-20
          • 2011-09-07
          • 2020-04-12
          • 1970-01-01
          • 1970-01-01
          • 2012-02-15
          • 1970-01-01
          • 2012-01-24
          • 1970-01-01
          相关资源
          最近更新 更多