2017-03-21 87 views
-1

例如:將私有域封裝到變量中是一種很好的做法嗎? C#

public class Test 
{ 
    private string _s; 

    public Test() 
    { 
     var s = "hello"; 
     _s = s; 
    } 

    public void Foo() 
    { 
     var s = _s; 
     // Use s for some reason. 
    } 

} 

我應該使用_s直接滿足我的需求或存儲_s成指向它的另一個變量?如果有財產而不是私人領域呢?

+0

這樣做的結果是什麼?我不清楚爲什麼你會創建你已有的變量。 – David

+0

只適用於一個乾淨的命名。但我問這個問題,以瞭解我是否正確! – CRK

+0

''只爲一個乾淨的命名'' - 命名類級別的成員's'並且問題變得沒有意義。如果現有的代碼需要改進,那麼改進現有的代碼。不要編寫更多代碼來混淆你想修復的代碼,只需修復它。 – David

回答

2

首先,「封裝」根本就不是你正在做的事情。你正在談論製作副本。在編程中,「封裝」意味着隱藏該字段並使每個人都可以通過某種類型的代碼訪問它。在C#中,幾乎總是意味着一個屬性(這實際上只是通過語法糖僞裝的方法調用)。在其他語言中,它可能是顯式獲取和設置方法。

所以。你應該複印一份嗎?

是:

private int _from = 9; 

public void f(int to) 
{ 
    for (int i = _from; i < to; ++i) 
    { 
     // stuff 
    } 
} 

號:

public f2() 
{ 
    Console.WriteLine("from is {0}", _from); 
} 

如果你想,你使用它正在改變的價值,但你不希望私人領域的改變,製作本地副本並改變它。

但請注意:值類型(例如int)的行爲與可變參考類型(如SqlConnection(見下文))的行爲非常不同。

如果你不會改變它,不要浪費你的時間。事實上,如果這個字段是一個引用類型,並且你創建了一個本地引用,那麼有人維護你的代碼會因此而誤認爲本地對象,並錯誤地認爲對它的修改不會產生類的影響。

private SqlConnection _conn = null; 

public MyClass() 
{ 
    _conn = new SqlConnection(); 
} 

public void f3() 
{ 
    var c = _conn; 

    // 150 lines of stuff 

    // OK, I guess we're done with it now! 
    c.Dispose(); 
    c = null; 

    // Now _conn is not null, yet the next call to f3() will find it unexpectedly 
    // in an invalid state. You really don't want that. 
} 

你從哪裏得到這個想法?

+1

不知道我在哪裏得到這個想法。也許就我自己而言,也許我認爲這樣的代碼更加乾淨,但我錯了。 – CRK

0

我沒有理由用局部變量代理私有字段。大多數情況下,該字段將是引用類型(即或多或少是一個類),因此使用局部變量僅意味着對該對象的更多引用。

如果你使用值類型的字段(例如,int),它可能實際上是有害的(無論如何,做非預期的事情)。你會對局部變量採取行動,只要你閱讀它就行了。但寫在字段不會改變。

相關問題