2013-03-13 55 views
1

我經常發現自己這樣做:如何避免私有成員分配在構造

class MyClass 
{ 
    public MyClass(int x) 
    { 
     this.x = x; 
    }   
    private int x; 

    ... 
} 

我每次添加一個新的私有成員變量的配置,我需要將其添加到構造函數的參數列表,以構造函數體,以及作爲成員的類。是否有避免額外輸入的良好編程模式?

+1

不要這樣想,不,不幸的是由於該變化是使用代碼片段,宏,加載項等 – Servy 2013-03-13 17:26:13

+1

這是我最喜歡的一個3個不同的地方是不利於Resharper的功能。我向構造器添加一個新參數,按Alt-Enter,輸入,然後它爲該參數初始化一個新字段。 – hometoast 2013-03-13 17:38:13

回答

2

一般來說,如果你用一堆私有成員實例化一個類,你必須傳遞給構造函數,那麼你已經在做一些問題了。

MyClass myClass = new MyClass(x, y, z, 7, 'c', someOtherClass) 

如果合適的話,您可以封裝相關領域進入一個結構或不同的類,像這樣

class MyClass 
{ 
    public MyClass(Coordinates coords) 
    { 
     this.coords = coords; 
    } 
    private Coordinates coords; 

} 

public struct Coordinates 
{ 
    public int X{get; set;} 
    public int Y{get; set;} 
    public int z{get; set;} 
} 

,然後你可以用

MyClass myClass = new MyClass(new Coordinates() { X = 1, Y = 2, Z = 3 }); 

實例化它沒有一個特定的實現,確定最佳解決方案是相當困難的,但是如果你實際上不需要設置fi在類的外部的視場,你可以這樣做

class MyClass 
{ 
    public MyClass() 
    { 

    }   
    private int x = 2; 

    ... 
} 

class MyClass 
{ 
    public MyClass() 
    { 
     this.x = 2; 
    }   
    private int x; 

    ... 
} 
+1

1)這實際上並沒有回答問題2)這通常是不可能的。很明顯,如果你在編譯時知道這個值,那麼你就會硬編碼它。但它非常常見,需要將其作爲參數接受。 – Servy 2013-03-13 17:28:51

+0

感謝您提出通過一個結構與配置參數。我更喜歡這個語法。但是,這並不是那麼有用,因爲在每次你想訪問該配置結構的成員時,內部你都有更多的輸入。結果是在一天結束時輸入更多。 – 2013-03-13 19:50:12

+0

@ChrisMerck「更多打字」本身不是你應該擔心的問題。你實際上應該擔心的是,當你必須在多個地方做出相同的改變時(有時你可能會忘記),而且你還必須擔心能夠閱讀你自己的代碼(或者甚至別人閱讀它)一個月後。 – 2013-03-13 19:59:47

0

我發現我可以濫用繼承實現我的目標。我設置了一個「Loader」子類,它的唯一目的就是插入基類的依賴關係。然後我們可以和基類一起工作,忘記裝載器。

然後,這有一個可怕的副作用,即阻止在基礎構造函數中使用這些受保護的成員變量 - 我們需要使用.Start()函數或類似的東西。所以,這是一個非常糟糕的解決方案,儘管保存了一些擊鍵。

public class MyClass 
{ 
    protected int param1; 
    protected int param2; 

    public void DoStuff() 
    { 
     Console.WriteLine(param1 + param2); 
    } 
} 


public class MyClassLoader : MyClass 
{ 
    public MyClassLoader() 
    { 
     param1 = 1; 
     param2 = 2; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 

     MyClass myObj = new MyClassLoader(); 
     myObj.DoStuff(); 

     Console.WriteLine("Press any key to quit."); 
     Console.ReadKey(); 
    } 
}