2014-11-14 75 views
0

我是一個相對較新的C#,對理解這條消息有點麻煩,以及它如何導致問題。我安裝了resharper之前沒有顯示錯誤,所以我認爲它只是糖語法錯誤?參數'角度'隱藏字段'float Utils.Transform.float'

public void SetTransform(float x, float y, float angle) 
{ 
    SetTransform(x, y); 
    this.angle = angle; 
} 

而且場本身:

float angle; 

我很困惑,如何能在方法的參數來隱藏字段變量...

+1

關於Resharper的建議:刪除您不感興趣的警告。將所有代碼加上不必要的下劃線使您跳過真實的警告。 – Andrew 2014-11-14 20:29:16

+0

領先一步。大聲笑。 – Gibbo 2014-11-14 20:41:15

回答

2

似乎非常清楚 - 你有名稱爲angle的隱藏類字段(this.angle

它不會引起任何問題,但是如果您有現有代碼引用該字段直接(而不是使用this.,那麼它將使用參數值代替。

它開始顯示與Resharper的原因是因爲Resharper更好地警告這種情況;它不是無效的代碼,所以它不是編譯器錯誤。

+0

謝謝你進一步闡述,我理解字段隱藏是如何工作的,但從來不知道一個參數可能隱藏一個字段,我總是認爲這個參數只是方法本身的本地對象。那麼如何避免呢?使用_angle代替成員字段? – Gibbo 2014-11-14 20:14:26

+0

這不是「隱藏」,你可以用'new'「隱藏」一個繼承的成員,但它的概念是一樣的。如何避免它是通過用大寫字母命名屬性和帶下劃線的字段。 – 2014-11-14 20:19:43

+2

或者只是堅持你所擁有的;它不是_error_,resharper只是警告你,在這種情況下'angle'有兩個不同的含義。如果你使用'this.'來訪問該字段,那麼你很好。 – 2014-11-14 20:20:52

4

這是一個警告信息,告訴你,你可能會混淆這兩個變量:通過使用像這樣下劃線

class IDontKnow 
{ 
    float angle; 

    public void SetTransform(float x, float y, float angle) { 
     SetTransform(x, y); 
     this.angle = angle; // Its not really clear by the naked eye which angle is used. 
    } 
} 

我建議重命名場角

class IDontKnow 
{ 
    float _angle; 

    public void SetTransform(float x, float y, float angle) { 
     SetTransform(x, y); 
     _angle = angle; // using underscore as a prefix makes the use of this-keyword redundant. 
    } 
} 

一般來說,你需要一些「清除」命名約定,對(受保護的和更高範圍的)字段和屬性,方法參數和局部變量進行清晰區分。這使代碼更具可讀性並避免了所提到的警告。

+0

是的,我認爲這是多少,我實際上在下面詢問_angle是否是正確或傳統的做法。我來自Java背景,從來沒有遇到過這個問題,我一直都知道這一點,不管是指什麼類。除非在C#中這是用其他方式嗎? – Gibbo 2014-11-14 20:16:09

+0

就像在java中有命名規則。看看它們,找到你最喜歡的方式並堅持下去。 (人們傾向於說下劃線是nono但是這是一些宗教話題) – CSharpie 2014-11-14 20:21:24

+0

StyleCop默認總是使用'this'來訪問任何類成員。這對我來說很不尋常,一開始很難打破舊習慣。但是,我已經開始意識到它明確區分了何時使用類方法和何時調用外部方法。對於專用字段,_前綴執行相同的工作。一般來說,我非常喜歡StyleCop約定。唯一的問題是,我傾向於在構造函數中爲參數選擇一個好名字時遇到問題 - 以避免R#警告的潛在問題。 – Spiralis 2015-08-14 12:05:07