![](/img/trans.png)
[英]Best practices about creating a generic object dictionary in C#? Is this bad?
[英]C# myths about best practices?
我的同事一直告訴我評論中列出的內容。
我很迷惑。 有人可以為我揭開這些神秘面紗嗎?
class Bar
{
private int _a;
public int A
{
get { return _a; }
set { _a = value; }
}
private Foo _objfoo;
public Foo OFoo
{
get { return _objfoo; }
set { _objfoo = value; }
}
public Bar(int a, Foo foo)
{
// this is a bad idea
A = a;
OFoo = foo;
}
// MYTHS
private void Method()
{
this.A //1 -
this._a //2 - use this when inside the class e.g. if(this._a == 2)
A //3 - use this outside the class e.g. barObj.A
_a //4 -
// Not using this.xxx creates threading issues.
}
}
class Foo
{
// implementation
}
this.
如果沒有名稱沖突,則是多余的。 只有當您需要對當前對象的引用或者您有一個與字段同名的參數時,才需要它。
線程問題與它無關。 混淆可能來自這樣的事實:大多數靜態成員都是實現的,因此它們是線程安全的,靜態成員不能用this.
來調用(!) this.
因為他們沒有綁定到實例。
“不使用this.xxx會產生線程問題”
是一個完整的神話。 只要問問你的同事,檢查產生IL,讓他解釋為什么他們不管添加相同this
與否。
“在課堂內使用這個,例如if(this._a == 2)”
歸結為你想要達到的目標。 你的同事似乎在說什么總是參考私人領域,這在我看來並不合理。 通常你想訪問公共屬性,甚至是在類中,因為getter可能會修改值(例如,當列表為null時,List類型的屬性可能會返回一個新的List實例,以避免在訪問屬性時出現空引用異常)。
我個人的“最佳實踐”是始終使用它。 是的,它是多余的,但是當您考慮多線程應用程序時,從第一個外觀中識別實例的狀態被查找或檢索的很好的方法。
詢問您的同事為什么認為這些建議是最佳做法可能會有所幫助? 通常人們會引用最佳實踐“規則”,這些規則是他們在沒有真正了解實踐背后的原因的情況下獲得的。
正如Lucero所說,除非()存在名稱沖突,否則不需要“this”。 然而,有些人喜歡在沒有嚴格要求的情況下加入“this”,因為他們認為它提高了可讀性/更清楚地顯示了程序員的意圖。 在我看來,這是個人偏好而不是其他任何事情。
至於你的“Bar”方法中的“壞主意”:你的同事可能會因為以下原因而考慮這種不良做法:如果“A”的setter方法被改變為有一些副作用,那么A = a; 也會產生這種副作用,而_a = a; 將只設置私有變量。 在我看來,最佳實踐是了解差異而不是偏愛另一個。
最后,“線程問題”是無意義的 - AFAIK“this”與線程無關。
數字2是一個神話,通過提及自動屬性很容易被揭穿。 自動屬性允許您定義沒有由編譯器自動生成的后備字段的屬性。 所以問你的同事他對自動屬性的看法是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.