我經常發現自己這樣做:如何避免私有成員分配在構造
class MyClass
{
public MyClass(int x)
{
this.x = x;
}
private int x;
...
}
我每次添加一個新的私有成員變量的配置,我需要將其添加到構造函數的參數列表,以構造函數體,以及作爲成員的類。是否有避免額外輸入的良好編程模式?
我經常發現自己這樣做:如何避免私有成員分配在構造
class MyClass
{
public MyClass(int x)
{
this.x = x;
}
private int x;
...
}
我每次添加一個新的私有成員變量的配置,我需要將其添加到構造函數的參數列表,以構造函數體,以及作爲成員的類。是否有避免額外輸入的良好編程模式?
一般來說,如果你用一堆私有成員實例化一個類,你必須傳遞給構造函數,那麼你已經在做一些問題了。
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)這實際上並沒有回答問題2)這通常是不可能的。很明顯,如果你在編譯時知道這個值,那麼你就會硬編碼它。但它非常常見,需要將其作爲參數接受。 – Servy 2013-03-13 17:28:51
感謝您提出通過一個結構與配置參數。我更喜歡這個語法。但是,這並不是那麼有用,因爲在每次你想訪問該配置結構的成員時,內部你都有更多的輸入。結果是在一天結束時輸入更多。 – 2013-03-13 19:50:12
@ChrisMerck「更多打字」本身不是你應該擔心的問題。你實際上應該擔心的是,當你必須在多個地方做出相同的改變時(有時你可能會忘記),而且你還必須擔心能夠閱讀你自己的代碼(或者甚至別人閱讀它)一個月後。 – 2013-03-13 19:59:47
我發現我可以濫用繼承實現我的目標。我設置了一個「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();
}
}
不要這樣想,不,不幸的是由於該變化是使用代碼片段,宏,加載項等 – Servy 2013-03-13 17:26:13
這是我最喜歡的一個3個不同的地方是不利於Resharper的功能。我向構造器添加一個新參數,按Alt-Enter,輸入,然後它爲該參數初始化一個新字段。 – hometoast 2013-03-13 17:38:13