2010-05-12 106 views
4

它說屬性不應該是「設置」(代碼分析規則CA1044),它也應該是「獲取」。如果我需要將值設置爲某個其他類的變量,我該怎麼辦?如何設置另一個類的值

將不斷變化,所以我不能通過構造函數傳遞它。

我應該爲此創建一個函數,如下所示?

class A 
{ 

    public void SetValue() 
    { 
     b = new B(); 
     b.SetTest(10); 
    } 
} 

class B 
{ 
    int test; 

    public void SetTest(int value) 
    { 
     test = value; 
    } 
} 

有什麼其他的選擇?

回答

3

我會用,這是一個有點混亂與只寫性能(從視圖類點的客戶端)同意,所以我儘量避免他們,而不是建立某種形式的一套方法。

微軟推薦的方式也似乎是它重寫的方法(或使其閱讀,如果適合寫):http://msdn.microsoft.com/en-us/library/ms182165.aspx

0

誰說屬性不應該只使用set訪問器?我沒有看到它的設計缺陷。如果有的話,我會很高興學到新東西:)

+3

我認爲當客戶端代碼有一個無法讀取的屬性時,它可能會令人困惑,但它不適合我。 「官方」原因將分析警告CA1044 - http://msdn.microsoft.com/en-us/library/ms182165.aspx – 2010-05-12 08:13:10

+0

@ho - 感謝您的CA規則。我忘了提及這個問題。我現在已經更新了這個問題。 – Ram 2010-05-12 08:15:59

+0

@ho +1,感謝您的信息。 – 2010-05-12 08:36:07

0

你的意思是這樣的?

public int Test { get; set; } 
2

如果您需要訪問其自己的類中的變量,您可以使用公共setter和私有getter。

class B { 
    public int test { private get; set; } 
} 
+0

這對我來說似乎是更好的選擇。但是,如果我可以從這個類自己設置價值,那麼爲什麼要設置私有集?是否只有在屬性中設置和獲取? – Ram 2010-05-12 08:16:44

+0

如果你不打算在某個地方使用該值,那麼設置一個值沒有意義。如果只是觸發一個動作,那麼你最好寫一個方法,正如接受的答案中提出的那樣。 – Prutswonder 2010-05-12 11:51:44

0

你舉的例子並沒有真正太大的意義,因爲你沒有抱着一種您的B實例,但你可以做這樣的事情:

class A 
{ 
    private B b; 

    public A() 
    { 
     this.b = new B(); 
    } 

    public void SetValue() 
    { 
     this.b.Test = 10; 
    } 
} 

class B 
{ 
    int test; 
    public int Test 
    { 
     get{ return this.test; } 
     set{ this.test = value; } 
    }  
} 

另一種方法是使Test財產autoproperty(其中框架生成支持字段),像這樣:

class B 
{ 
    public int Test{get; set;} 
} 
相關問題