Instanciate接口到新的C类#

时间:2016-10-10 10:34:31

标签: c# asp.net .net asp.net-mvc

我正在阅读WebHostBuilder.cs课程。

我不清楚为什么private readonly IHostingEnvironment _hostingEnvironment;

在构造函数中实例化为_hostingEnvironment = new HostingEnvironment();

这是(为简洁而修改)代码:

public class WebHostBuilder
{
    private readonly IHostingEnvironment _hostingEnvironment;

    public WebHostBuilder()
    {
        _hostingEnvironment = new HostingEnvironment();
    }
}

更新

我发现这个问题很有用。 Cast interface to its concrete implementation object or vice versa?

1 个答案:

答案 0 :(得分:4)

我想你很困惑,在构造函数中设置了值,而不是声明字段的位置。在您的示例中,您可以轻松地并且可能还有效地编写以下内容:

 private readonly IHostingEnvironment _hostingEnvironment = new HostingEnvironment();

这将具有完全相同的效果,因为它被编译器隐式转换为构造函数语句。所以两者都很相似。

但是当你不知道在编译时使用的值时,存在需要使用构造函数。想象一下HostingEnvironment的构造函数需要传递一个整数:

public class WebHostBuilder
{
    private readonly IHostingEnvironment _hostingEnvironment // = new HostingEnvironment(whatToSetHere ???);

    public WebHostBuilder(int i)
    {
        _hostingEnvironment = new HostingEnvironment(i);
    }
}

在编译期间,您不知道要为HostingEnvironment - 构造函数提供的值。所以你尽早提供它,在本例中是你自己类的构造函数。

此外,readonly - 修饰符只是声明您只能在构造函数中设置成员的值(或者使用声明来转换为构造函数 - 打电话,记住我上面提到过的事情。)