2016-08-11 99 views
0

我目前正在研究一個ASP.NET Core MVC應用程序(我正在將一個項目從.NET遷移到.NET Core),我在想基礎構造函數。什麼是基類構造函數,我爲什麼要使用它? (帶示例)

具體來說就像代碼:

public partial class CompanyFormsContext : DbContext 
{ 
    public CompanyFormsContext() 
     : base("name=CompanyFormsContext") 
    { 
    } 

    public CompanyFormsContext(string connName) 
     : base("name=" + connName) 
    { 
    } 
... 
} 

這是一個ASP.NET的語法和現在的DbContext不接受字符串作爲參數,而是接受DbContextOptionsBuilder。

我的問題是:如何以及何時基類構造函數是有用的?在這裏,我可以爲CompanyFormsContext提供一個空的構造函數,但是我仍然可以爲基類構造函數傳遞一個參數?

我猜測基礎構造函數與DbContext相關,因爲CompanyFormsContext是一個子類。但是,我很困惑,爲什麼我可能想在這裏使用基類。

這裏有兩種方法,我們在項目中調用這些方法:

 //First 
     var db = new CompanyFormsContext(siteUrl.StartsWith("http://www.") ? "CompanyFormsContext" : "CompanyFormsContextQA"); 
     //Second 
     var env = Request.Headers["environment"].First(); 
     var db = new CompanyFormsContext(env); 

,我可能會在一個方式,他們將與新的.NET核心語法工作來修改這些。每個這些實例將調用哪個構造函數?

不久,我想了解在這種情況下如何使用基類,以及它們的一般用途是什麼。謝謝

回答

2

如果在很多不同的場景中使用某種初始化,則會使用基類構造函數。舉例來說,如果你有這樣的事情

public bool Abc { get; set; } 

private readonly string x; 

private readonly string newName; 

public Test(string x, string newName) 
{ 
    Abc = true; 
    thix.x = x; 
    this.newName = newName; 
} 

(是的,非常愚蠢的例子,但無論如何),你總是想要一個初始化可能發生,你不希望有每一次遍地再次鍵入你有一個新的派生類。這不僅會令人討厭,而且從維護的角度來看會很糟糕;如果由於某種原因必須更改邏輯,則必須到每個輸入並更改它的地方,如果意外錯過了某個地方,則會在系統中引入一個錯誤。

請注意,父類型和派生類型都可能有幾個構造函數。例如:

public abstract class SomeClass 
{ 
    public SomeClass(string a, string b) 
    { 
     // ... 
    } 

    public SomeClass() 
    { 
     //... 
    } 
} 

public SomeDerivedType : SomeClass 
{ 
    public SomeDerivedType(string a, string b) : base(a, b) 
    { 
     // ... 
    } 

    public SomeDerivedType() : base("test", "string") 
    { 
     // .. 
    } 
} 

基礎構造函數和派生類型構造函數具有不同的參數是完全有效的。如果你考慮一下,那就很有道理;你正在調用一個完全不同的構造函數。它將,例如,是非常有效的做到以下幾點:

public SomeDerivedType()... 
{ 
    // The CollectionType constructor has a different number of parameters than SomeDerivedType does 
    abc = new CollectionType<int>(1, 2, 3, 4, 5); 
} 
+0

一個很好的例子 –

0

你用字符串參數調用你的構造函數。所以接受一個字符串的那個被執行。您的基類的構造函數也由於:base()而被執行。

如果您想要執行該構造函數中的代碼,您通常會使用基礎構造函數..並且您不能或不希望將該代碼複製到您的childconstructor。除非你不想要基礎構造函數代碼被執行,否則總是這樣。你可以通過不使用base來覆蓋它()

1

採取在MSDN看https://msdn.microsoft.com/en-us/library/ms173115.aspx

在派生類中,如果一個基類的構造方法中沒有使用顯式調用基本關鍵字,默認構造函數(如果有的話)隱式調用。這意味着下面的構造函數的聲明實際上是相同的:

...

如果一個基類沒有提供默認的構造函數,派生類必須顯式調用基構造通過使用基地。 構造函數可以使用this關鍵字調用同一對象中的另一個構造函數。就像base一樣,這可以使用帶或不帶參數,並且構造函數中的任何參數都可用作參數,或者作爲表達式的一部分。例如,上例中的第二個構造函數可以使用該被改寫:

0

https://msdn.microsoft.com/en-us/library/hfw7t1ce.aspx

public class BaseClass 
{ 
    int num; 

    public BaseClass() 
    { 
     Console.WriteLine("in BaseClass()"); 
    } 

    public BaseClass(int i) 
    { 
     num = i; 
     Console.WriteLine("in BaseClass(int i)"); 
    } 

    public int GetNum() 
    { 
     return num; 
    } 
} 

public class DerivedClass : BaseClass 
{ 
    // This constructor will call BaseClass.BaseClass() 
    public DerivedClass() : base() 
    { 
    } 

    // This constructor will call BaseClass.BaseClass(int i) 
    public DerivedClass(int i) : base(i) 
    { 
    } 

    static void Main() 
    { 
     DerivedClass md = new DerivedClass(); 
     DerivedClass md1 = new DerivedClass(1); 
    } 
} 
/* 
Output: 
in BaseClass() 
in BaseClass(int i) 
*/ 

在這裏,我意識到,鑑於在DerivedClass,BaseClass的構造函數沒有信息被調用。因此,我的問題:

public partial class CompanyFormsContext : DbContext 
{ 
    public CompanyFormsContext() 
     : base("name=CompanyFormsContext") 
    { 
    } 

    public CompanyFormsContext(string connName) 
     : base("name=" + connName) 
    { 
    } 
... 
} 

的DbContext(串)被稱爲在這兩種情況下,但在一種情況下,輸入參數爲"name=CompanyFormsContext",並在另外一個是"name=" + connName

因此,要能夠使用.NET Core語法更改爲DbContextOptionsBuilder參數,可以定義兩個OptionsBuilder實例,然後根據CompanyFormsContext的輸入在基礎構造函數中調用它們。

我相信這就是我一直在尋找的,我能夠得到這個感謝其他答案。我會改進我的答案,並在完成後分享完整的代碼。

相關問題