如何处理未分配的新的表达并不需要分配
小例子做:如何处理未分配的新的表达并不需要分配
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
这是法律上的原因,为什么不分配这些任何变量。我担心编译器会优化哪些内容。但更令人担心的是,这段代码看起来并不像应该如何。
在这种情况下,需要做什么,这段代码不会看起来不好?
你可能最好在这里有上的文件一个工厂方法或将文件添加到文件夹中的文件夹对象的一个方法。
对于第一:
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");
无论哪种模式会工作,但第二个保持更真实的面向对象的设计。
编译器不会“优化”您对File
构造函数的调用。但是,你在这里做的不是一个好主意。从使用中不清楚Folder
被传递给File
构造函数正在被修改并且正在存储对新的File
的引用,以便它实际上不被垃圾收集。
请考虑,而不是做这样的事情:
class Folder
{
...
public void AddFile(string name)
{
Children.Add(new File(this, name));
}
}
我的意思是编译器会优化代码本身。但是不要紧。 – KugBuBu 2014-09-30 16:41:24
@KugBuBu我明白了。如果您将'MyClass(...);'作为独立语句来编写,它不会被编译器删除。然而,这是一个不好的做法,因为有人阅读代码时不清楚为什么创建了“MyClass”的实例但未使用。 – 2014-09-30 16:43:40
目前还不清楚你在问什么。另外,最后3条线就是这样排列的,没有包含它们的东西? – 2014-09-30 16:31:52
@SaverioTerracciano'在这种情况下,需要做什么,这段代码不会显得不专业?',需要做的是,这两条线不会只是两条新的声明。这3条线当然有一些方法。 – KugBuBu 2014-09-30 16:33:19
如果这3行是在某种方法,为什么不显示也包含它们的方法?目前还不清楚** professional **的含义,如果您想要了解一些好的或不好的做法的建议,您最好提供一些关于您想要完成的内容的更多信息。 – 2014-09-30 16:35:30