如何重写以下代码,以便我不必在只由构造函数调用的方法中分配readonly变量?

时间:2011-08-21 23:29:50

标签: c#

e.g

        Class A
          {
           readonly Bclass B;
           readonly Cclass C;
           public void Class()
               {
                 Action1();
                 Action2();
                 Action3();
               }
           void Action2()
              {
                Dosomething1();
                B=Dosomething2(); //There goes the problem.
                C=Dosomething3();
                Dosomething4();
              }
           ...
          }
顺便说一句,我知道我可以将所有Dosomthing()放入构造函数中,但代码因此变得不那么可读。

2 个答案:

答案 0 :(得分:0)

您可以重构A,以便将B作为仅包含setter的属性公开:

public class A
{

    public A() 
    {
        _b = DoSomething();
    }

    private BClass MyClassB
    {
        get { return _b; }
    }

    private BClass _b;
}

您可能会做一些其他事情,但很难确切地看到使用readonly B {{1}}实例的问题。它将以这种方式完成,使其成为不可变的 - 一旦在构造函数中设置它就无法在类中的任何其他地方进行更改 - 请注意,如果使用上面说明的属性,则会失去不变性。

答案 1 :(得分:0)

    Class A
      {
       readonly Bclass B;
       readonly Cclass C;

       public void Class()
           {
             Action1();
             Tuple<B,C> init = Action2();
             B = init.B;
             C = init.C;
             Action3();
           }
      }

不幸的是,C#缺乏元组支持,所以你不能写

B, C = Action2();