2011-12-30 60 views
1

我有以下類:如何構建一個類時,將字段的值設置爲默認值?

public abstract class AuditableTable : TableServiceEntity, IAuditableTable 
    { 

    protected AuditableTable() 
     : base() 
    { 
     Status = "3"; 
    } 

    protected AuditableTable(string pk, string rk) 
     : base(pk, rk) 
    { 
    } 
    public string Status { get; set; } 

有一個簡單的辦法,我可以使狀態的值總是默認爲「3」創建一個新的實例時?大多數人使用的方式是什麼?

更新

我添加了一個二傳手,但這時如果其他構造函數被調用它不會設置。

回答

3

請勿使用自動實施的屬性。聲明具有初始值的私人字段。

private int _status=3; 

public int Status 
{ 
    get { return _status;} 
    set {_status=value;} 
} 

編輯:指定在constructor屬性值是good practice但如果這個類有一個以上的構造比我想這將是很好的聲明來初始化成員。

+1

爲什麼不呢?好奇。 – 2011-12-30 04:40:52

+0

爲什麼你需要一個具有支持屬性的字段?你可以簡單地使用構造函數。 – Maheep 2011-12-30 04:41:15

+0

我已更新我的帖子。 – adatapost 2011-12-30 04:51:15

3

你可以在構造函數中做到這一點。這就是他們的用法。

public abstract class AuditableTable : TableServiceEntity, IAuditableTable 
{ 

    protected AuditableTable() 
     : base() 
    { 
     InitFields(); 
    } 

    protected AuditableTable(string pk, string rk) 
     : base(pk, rk) 
    { 
     InitFields(); 
    } 
    private InitFields() 
    { 
     Status = "3"; 
    } 
    public string Status { get; set; } 
} 

UPDATE:

正如你已經更新的問題,你也可以看看this answer重新安排你的構造。

+0

謝謝。但是現在我懷疑我有多個構造函數。有什麼辦法可以做到,所以我不必在每個構造函數中編寫代碼? – 2011-12-30 04:45:35

+0

@ Samantha2您需要決定一個執行賦值的構造函數,並使用':this()'語法從其他構造函數中調用該構造函數。 – dasblinkenlight 2011-12-30 04:52:47

3
protected AuditableTable() { // no need to use : base(), it is called implicitly 
    Status = 3; 
} 
1

這通常是通過鏈接構造函數完成的。你通過一個通用的構造函數調用每個構造函數。例如:

public class MyThing : MyBaseThing 
{ 
    public MyThing() 
     : this(null, null) 
    { 
    } 

    public MyThing(string pk, string rk) 
     : base(pk, rk) 
    { 
     Status = "3"; 
    } 

    public string Status { get; set; } 
} 

如果您可以鏈式構造函數,那效果很好。但有時你會有不能鏈接的構造函數。如果是這樣的話,那麼你要確保每個「葉子」構造函數都調用某種私有的方法,它會執行常見的初始化。當你有一個readonly字段時,這種情況有時會很痛苦,因爲readonly字段只能在構造函數中修改 - 而不能在構造函數調用的方法中修改。

刪除的答案建議使用具有明確後臺字段的屬性,而不是使用自動實現的屬性。儘管如此,這是一個完全有效而且很合理的做法,也是負面的評論。當然,它不像自動實施的財產一樣漂亮,但它非常有效。這是我們在自動實現屬性之前所做的,如果您確實需要屬性的默認值,沒有理由不這樣做。如果您看不到已刪除的答案:

public class MyThing : MyBaseThing 
{ 
    private string _status = "3"; 
    public string Status 
    { 
     get { return _status; } 
     set { _status = value; } 
    } 

    // constructors go here. 
} 
+0

謝謝你吉姆。我從這篇文章中學到了很多東西。 – 2011-12-30 05:12:37

相關問題