【问题标题】:What to do with unassigned new expression that doesn't need to be assigned如何处理不需要分配的未分配的新表达式
【发布时间】:2014-09-30 16:30:08
【问题描述】:

小例子:

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 行是这样排列的,没有任何内容吗?
  • @SaverioTerracciano In this situation, what need to do that this code won't look unprofessional?,需要做什么才能使这两行不仅仅是广播中的两个新声明。这 3 行当然是某种方法。
  • 如果这 3 行在某种方法中,为什么不显示包含它们的方法?目前还不清楚你所说的专业是什么意思,如果你想获得一些关于好的或坏的做法的建议,你最好就你想要完成的工作提供更多的见解。
  • @SaverioTerracciano 此代码只是我编写的示例。我不想在某个程序上完成任何事情,我经常遇到这样的新语句被遗漏了。我要改掉这个习惯。

标签: c# code-formatting


【解决方案1】:

编译器不会“优化”您对File 构造函数的调用。但是,您在这里所做的并不是一个好主意。从用法中并不清楚传递给File 构造函数的Folder 正在被修改,并且正在存储对新File 的引用,因此它实际上不会被垃圾收集。

考虑改为这样做:

class Folder 
{
    ...

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

【讨论】:

  • 我的意思是编译器会优化代码本身。不过没关系。
  • @KugBuBu 我明白了。如果您将new MyClass(...); 编写为独立语句,则编译器不会将其删除。但是,这是一种不好的做法,因为阅读代码的人不清楚为什么创建了 MyClass 的实例但没有使用。
【解决方案2】:

您可能最好在这里使用 File 上的工厂方法或将文件添加到文件夹对象上的文件夹的方法。

对于第一个:

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");

任何一种模式都可以,但第二种模式更符合面向对象的设计。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 2012-03-25
    • 2014-04-23
    • 2020-07-25
    相关资源
    最近更新 更多