0

遍历下面的 C# 代码(第 1 部分) - 为清楚起见进行了简化,它还有实例方法、更多成员等。我是否在这里遗漏了一些非常聪明的编程模式,或者它可以轻松地简化为第 2 部分?Address() 类型非常简单,实际上更像是一个数据传输对象。

第 1 部分:

public class MyStuff
{
    private IAddress _address;

    public MyStuff()
    {
            SetAddress(_address = new Address());
    }

    private void SetAddress(IAddress addr)
    {
        _address = addr;
    }
}

第 2 部分:

public class MyStuff
{
    private IAddress _address = new Address();

    public MyStuff()
    {
        //The constructor is probably redundant too
    }
}
4

2 回答 2

2

你还没有澄清_addressDao,所以我将涵盖这两个基础:


以下假设_addressDao存在某处并需要保留。

您无法将其压缩为第 2 部分,因为_addressDao. 第 1 部分_address在方法调用期间设置 inline 然后还设置_addressDao,您的第二部分省略_addressDao,所以等价。


以下假设这_addressDao是一个错字和/或不再需要保留。

_addressDao如果我们假设不是问题,那么第 2 部分可以是第 1 部分的有效替代方案。对于您的情况,这可能不是最好的方法,但是您并没有要求这样做,因此我不会对此进行诽谤。


内联类成员初始化,如果内存服务,编译成相同的东西,就好像你直接在构造函数中初始化它一样。最终结果是相同的行为,只是看起来不同的代码。

在第 2 部分中,您也正确地认为不再需要公共无参数构造函数,在没有任何构造函数的情况下,默认情况下会添加它。


关于这里使用的潜在设计模式,它可能是 IoC 或 DI 的尝试——但似乎在这两种情况下都没有成功。

于 2012-07-09T14:53:17.657 回答
1

理想情况下,他们会做同样的事情。Piece 2 在运行时实际发生的是 _address 的初始化在 MyStuff() 构造函数中运行,在您的代码或任何 this()/base() 调用之前。

这里有很好的信息: C# 成员变量初始化;最佳实践?

我认为 Piece 2 更容易阅读,但这纯粹是个人喜好。

话虽如此,您的第一部分是分配 _address 两次。一次调用函数,一次调用函数本身。

于 2012-07-09T14:54:58.540 回答