你在实例变量前面使用'this'吗?

时间:2009-04-17 20:14:04

标签: c# coding-style

当从类本身访问类的实例变量或属性时,是否用“this.”作为前缀?

17 个答案:

答案 0 :(得分:28)

我只在构造函数或setter中使用this.前缀,主要是在传递的参数与相关成员变量具有相同名称的情况下。

答案 1 :(得分:21)

在C#中,我绝对会这样做。主要原因是:

  1. 是否要这样做是 风格问题。尽管如此 继续战斗,我没有 相信这是客观的 更好的方法。

  2. 我的源码分析工具(StyleCop) 默认需要this. 实例访问前面。我的 第一点意味着我不应该 关心我是否经常这样做 或者总是不这样做,因为 默认StyleCop设置是 总是需要它,我走的路 阻力最小/最大 一致性,我遵循默认 设置。

  3. 我对大多数风格问题都遵循这一理念。我非常喜欢更改自动格式化IDE中的默认格式选项。它只是让每个人的生活更加艰难,而不是那么重要。

答案 2 :(得分:11)

没有。我认为它是视觉噪音。我认为这个变量是错误命名风格的拐点。在我的类型中,我应该能够管理字段,属性和方法的命名。

没有充分的理由将后备字段命名为“myfield”,构造函数的参数为​​“myField”,属性为“myField”。

 public class TestClass
 {
    private string myField;
    public TestClass(string myField)
    {
      this.myField = myField;
    }
    public string MyField {get { return myField;} set {myField = value}}
 }

就个人而言,我总是在所有私人支持字段中添加_的前缀。

 public class TestClass
 {
    private string _myField;
    public TestClass(string myField)
    {
      _myField = myField;
    }
    public string MyField {get { return _myField;} set {_myField = value}}
 }

现在使用C#中的自动属性

 public class TestClass
 {
    private string MyField {get; set;}
    public TestClass(string myField)
    {
      MyField = myField;
    }
 }

除了上述内容,也许是您输入此内容的唯一时间。是因为你想看到当前类型的intellisense。如果你需要这样做,那么我提交你的类型太大,可能不遵循Single Responsibility Principle。让我们说你是。为什么保持这个。实际拨打电话后。重构它。

答案 3 :(得分:8)

它增加了混乱。所以没有。

答案 4 :(得分:7)

绝对。 'this'避免需要任何前缀,例如m_。更重要的是,它可以快速提高代码的性能,这就是原因:

我真的接受了微软警察(FxCop,StyleCop)。他们真的帮助我捕捉到通常我甚至都不会想到的事情。例如,如果方法不引用任何成员变量,则FxCop的一个建议是将该方法标记为静态,因此不必将该方法分配给该类的每个实例。来自MSDN

  

不访问实例的方法   数据或调用实例方法都可以   标记为静态(在Visual中共享)   基本)。将方法标记为   静态,编译器会发出   这些非虚拟呼叫站点   成员。发出非虚拟呼叫   站点将阻止运行时检查   对于每个确保该呼叫的呼叫   当前对象指针是非null。   这可以导致可测量的   性能提升   性能敏感的代码。在一些   案件,无法访问   当前对象实例表示一个   正确性问题。

使用'this'为我的成员变量添加前缀。为我做两件事。首先,它满足StyleCop。其次,更重要的是,它可以帮助我快速确定某个方法是否需要标记为静态。

当然,运行FxCop会告诉我是否需要将方法标记为静态。但是,使用'this'。帮助我花更多时间编写新代码,减少纠正FxCop违规行为的时间。

答案 5 :(得分:5)

我认为这种做法大多数时候都能提高易读性,所以是的。

答案 6 :(得分:3)

任何时候我都有一个方法参数,其名称与实例变量(很少)相同,以避免混淆。

答案 7 :(得分:2)

不,但后来我写了很多VB;)

关于我唯一一次检查这个/我是当我不记得该成员的确切名称或我需要将其与同名的功能参数区分开来时。

答案 8 :(得分:2)

都能跟得上!我当然可以看出这可能是有益的,但我所做的任何事情都不够复杂,需要另外一定程度的澄清。

答案 9 :(得分:2)

我们正在使用ReSharper来管理所有这些。大多数情况下,我们删除'this'除非将它保留在构造函数中,因为我们通常使用具有相同名称的构造函数参数。

答案 10 :(得分:1)

一般是的,我这样做。通信范围是可读性的重要方面。它将它与局部变量,静态方法等区分开来。它还表明定义是“附近的”。

哦,我只对公共方法/属性这样做。那些倾向于大写,所以这个.Thing看起来正确。内部视图看起来像外部视图(myInstance.Thing)。私人财产通常是小写的,所以对于那些人来说这是一个不太吸引人的想法。

当然不是绝对必要的,有些人更喜欢它更简洁。但它为我和其他可能会查看代码的开发人员提供了提示。

答案 11 :(得分:1)

是的,如果我看到这个。我确定它是本地的,我不需要再看了。如果没有这个前缀。 (或者可能是'_')我必须检查它是在本地还是在祖先中声明,或者它是一个参数还是......

所有这些检查在调试过程中需要花费更多时间......

答案 12 :(得分:1)

我这样做,对我而言,它为代码添加了一些清晰度,是在当前程序还是在类中?

答案 13 :(得分:0)

如果您的实例变量名称与方法参数相同 - 它不再是“仅仅是澄清的理由”。如果你不做前置,可能会导致缺陷。

我认为这就是Ben S的意思 - 但只是想强调 - 这不再是最佳实践的问题。

我经常这样做 - 增加清晰度。 我认为它不会增加杂乱 - 因为我们的大脑很快就读过它,但注意它是一个实例变量

答案 14 :(得分:0)

仅在需要区分参数时,如在setter或构造函数中。我认为在不必要的情况下使用它是“codejunk”,类似于Edward Tufte的chartjunk。噪音,而不是信号。

答案 15 :(得分:0)

我做了很多,因为它会自动填充弹出窗口。

答案 16 :(得分:0)

我愿意。当Visual Studio中的Intellisense不像现在那样聪明时,我养成了习惯。

我觉得我没有分散注意力,我想是因为我写了很多Python并习惯于在任何地方看到自己。