2014-11-14 80 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