2014-09-30 77 views
0

小例子做:如何處理未分配的新的表達並不需要分配

class Folder { 
    public List<B> Children = new List<B>(); 
    public string Name; 

    public Folder(string name) { Name = name; } 
} 
class File { 
    public Folder Parent; 
    public string Name; 

    public File(Folder parent, string name) { 
     Parent = parent; 
     Name = name; 
     Parent.Children.Add(this); 
    } 
} 

Folder folder=new Folder("windows"); 
new File(folder, "notepad.exe"); //<--- this 
new File(folder, "regedit.exe"); //<--- and this 

這是法律上的原因,爲什麼不分配這些任何變量。我擔心編譯器會優化哪些內容。但更令人擔心的是,這段代碼看起來並不像應該如何。

在這種情況下,需要做什麼,這段代碼不會看起來不好?

+3

目前還不清楚你在問什麼。另外,最後3條線就是這樣排列的,沒有包含它們的東西? – 2014-09-30 16:31:52

+0

@SaverioTerracciano'在這種情況下,需要做什麼,這段代碼不會顯得不專業?',需要做的是,這兩條線不會只是兩條新的聲明。這3條線當然有一些方法。 – KugBuBu 2014-09-30 16:33:19

+0

如果這3行是在某種方法,爲什麼不顯示也包含它們的方法?目前還不清楚** professional **的含義,如果您想要了解一些好的或不好的做法的建議,您最好提供一些關於您想要完成的內容的更多信息。 – 2014-09-30 16:35:30

回答

2

你可能最好在這裏有上的文件一個工廠方法或將文件添加到文件夾中的文件夾對象的一個​​方法。

對於第一:

class File 
{ 
    public Folder Parent; 
    public string Name; 

    public static void Create(Folder parent, string name) 
    { 
     Parent.Children.Add(new File { Parent = parent, Name = name }); 
    } 
} 

var folder = new Folder("windows"); 
File.Create(folder, "notepad.exe"); 
File.Create(folder, "regedit.exe"); 

對於第二個:

class Folder 
{ 
    public List<File> Children = new List<File>(); 
    public string Name; 

    public Folder(string name) { Name = name; } 

    public void Add(string name) 
    { 
     Children.Add(new File { Parent = this, Name = name }); 
    } 
} 


var folder = new Folder("windows"); 
folder.Add("notepad.exe"); 
folder.Add("regedit.exe"); 

無論哪種模式會工作,但第二個保持更真實的面向對象的設計。

3

編譯器不會「優化」您對File構造函數的調用。但是,你在這裏做的不是一個好主意。從使用中不清楚Folder被傳遞給File構造函數正在被修改並且正在存儲對新的File的引用,以便它實際上不被垃圾收集。

請考慮,而不是做這樣的事情:

class Folder 
{ 
    ... 

    public void AddFile(string name) 
    { 
     Children.Add(new File(this, name)); 
    } 
} 
+0

我的意思是編譯器會優化代碼本身。但是不要緊。 – KugBuBu 2014-09-30 16:41:24

+0

@KugBuBu我明白了。如果您將'MyClass(...);'作爲獨立語句來編寫,它不會被編譯器刪除。然而,這是一個不好的做法,因爲有人閱讀代碼時不清楚爲什麼創建了「MyClass」的實例但未使用。 – 2014-09-30 16:43:40