[英]c# getters setters style
我正在研究一些代碼,其中有很多這樣的代碼:
private int x;
public void SetX(int new_x)
{
this.SetXValue(new_x);
}
private void SetXValue(int new_x)
{
this.x = new_x;
}
和類似的屬性:
private int x;
public int X
{
get { return this.GetX(); }
}
private int GetX()
{
return this.x;
}
我沒有得到的是為什么需要私有方法來做實際工作,即為什么不只是有這樣的方法:
public void SetX(int new_x)
{
this.x = new_x;
}
public int X
{
get { return this.x; }
}
它只是其他人的個人選擇還是有一些使用第一種方式的充分理由?
(我手動輸入上面的代碼很抱歉,如果有任何錯誤,但你應該希望看到我想說的話)
干杯A.
就我所見,沒有理由像這樣的代碼。 如果你沒有對新值做任何事情(比如存儲前的處理/檢查),而你正在編寫C#3.0,你實際上可以簡單地將它簡寫為:
public int MyProperty { get; set; }
編譯器為您創建后備存儲,您只需引用:
this.MyProperty
......在你的班級里面。 您還可以創建僅限get的屬性,例如:
public int MyProperty { get; private set; }
我認為所有這些都非常整潔!
為什么不直接使用Getters和Setter來實現邏輯? 除非你有額外的參數影響setter的行為,否則我不理解需要其他方法:
private int myVar;
public int MyProperty
{
get
{
return myVar;
}
set
{
myVar = value;
}
}
public void SetMyPropertySpecial(int a, string reason)
{
Console.WriteLine("MyProperty was changed because of " + reason);
this.myVar = a;
}
更新:
實際上,這個人似乎喜歡擁有更多代碼,但結構完全沒用。 使用Getters和Setters堅持.NET標准(參見MSDN )
不,沒有理由這樣做,看起來有人用代碼行付錢。
所以,是的,你是對的,這只是其他人的個人選擇,而且這不是一個很好的選擇。
我認為它必須是一個舊的Java開發人員才能做到這一點。
.Net的方式是
private int _foo;
public int Foo
{
get
{
return _foo;
}
set
{
_foo = value;
dostuff();
}
}
一般的經驗法則是,當存在獲取/設置值所需的邏輯的相關部分時(例如,在get期間的設置或數據庫訪問期間的驗證),使用屬性進行簡單的get / set操作和get / set方法。
因此,如果實際代碼非常簡單,只需使用屬性並在其getter / setter中完成工作。
如果實際代碼更復雜,請按照第三個示例中的方法替換屬性(至少是setter)。
一個可能的原因是屬性可以具有只有在外部設置屬性時才應執行的登錄,並且來自類內部的調用不執行整個邏輯而只執行私有方法中的邏輯。 當然,提前制作這些方法是沒有意義的,因為以后引入這些方法不會改變課程的合同。 編寫此代碼的人可能是C#的新手,並且不了解屬性的作用。
這非常離奇,沒有正當理由這樣做。 請重構該代碼。 也不需要SetX
方法,因為setter可以包含在屬性中。 例如:
public int X {get; set;}
我可能失去了一些東西,但是這看起來有點瘋狂的給我!
您可以通過使用自動屬性或具有支持字段的屬性來實現相同的目的。 這里有兩個很好的描述: http : //weblogs.asp.net/dwahlin/archive/2007/12/04/c-3-0-features-automatic-properties.aspx
是的,只有當SetValue
是private
或protected
並且不僅僅是設置一個值時,這也沒關系。
我正在做一個我們做很多事情的項目。 這是因為我們所做的不僅僅是設置一個值(值檢查,狀態檢查等)。擁有一個公共setter和一個公共SetValue
根本沒有意義,並且會讓你的消費者混淆使用什么setter。
這是我們使用這種設計的另一種情況:
public abstract class A{
protected virtual void SetValue(object value);
public object SomeObject{
set{SetValue(value);}
}
}
在這種情況下,我們希望類A
將設置/檢查該值委托給從中繼承的任何類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.