【问题标题】:Instanciate Interface to new Class C# [closed]将接口实例化到新的 C# 类 [关闭]
【发布时间】:2016-10-10 10:34:31
【问题描述】:

我正在阅读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?

【问题讨论】:

  • readonly 只是意味着,在修改此成员时无法访问。因此,如果一个类有一个具有名称的自定义类型的只读成员,那么您可以将名称设置为具有只读成员的类实例的新值,但您不能分配只读将自身成员添加到新值
  • 究竟是什么不清楚?你对这段代码的期望是什么?
  • 我也不明白这个问题。您希望在哪里 else 设置该值?我猜你必须设置一个值,如果你想(而且你肯定想)在访问该字段时避免 NullReferenceException。
  • 伙计们,我想他在问为什么IHostingEnvironment 类型的变量是用HostingEnvironment 实例化的?也许他需要阅读接口和具体类型。
  • 或者您是否感到困惑,为什么初始化不只是代替声明发生,所以您将字段声明为private readonly IHostingEnvironment _hostingEnvironment = new HostingEnvironment();

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


【解决方案1】:

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

 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-constructor 提供的值。因此,您在获得它时就提供它,在这种情况下是在您自己的类的构造函数中。

此外,readonly-修饰符只是声明您只能在构造函数中设置成员的值(或在声明中,它被转换为构造函数调用,记住我上面提到的)。

【讨论】:

  • private readonly HostingEnvironment _hostingEnvironment = new HostingEnvironment();一样为什么接口IHostingEnvironment设置为new HostingEnvironment();
猜你喜欢
  • 2013-03-13
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多