2016-10-10 57 views
-2

我在閱讀WebHostBuilder.cs類。Instanciate接口到新的C類#

這不是很清楚,我爲什麼private readonly IHostingEnvironment _hostingEnvironment;

在構造函數中被實例化作爲_hostingEnvironment = new HostingEnvironment();

這裏是(修改簡潔)代碼:

public class WebHostBuilder 
{ 
    private readonly IHostingEnvironment _hostingEnvironment; 

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

UPDATE

我發現這個問題很有用。 Cast interface to its concrete implementation object or vice versa?

+0

只讀表示在修改此成員時沒有可訪問性。所以如果一個類只有一個具有名稱的自定義類型的只讀成員,那麼您可以使用只讀的meber將該名稱設置爲類的一個實例的新值,但是您不能**將只讀成員itselfe分配給新值 – Radinator

+6

究竟是什麼不明確?您對此代碼的期望是什麼? – Andrei

+1

我不理解這個問題。您希望在哪裏設置其他值?我想你*有*要設置一個值,如果你想(和你明確想要)避免NullReferenceException後訪問該字段。 – HimBromBeere

回答

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 -constructor。所以你儘早提供它,在這種情況下在你自己的類的構造函數中。

另外readonly -modifier只是說,你可以設置內構造一個成員的值(或與聲明,將其轉化爲一個構造函數調用的地方,記得從來就提到以上)。

+0

是否與私人只讀相同HostingEnvironment _hostingEnvironment = new HostingEnvironment();'爲什麼接口'IHostingEnvironment'設置爲'new HostingEnvironment();' – datkom