我的同事一直告诉我评论中列出的内容。
我很困惑。 有人可以为我揭开这些神秘面纱吗?
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
}
答案 0 :(得分:10)
如果没有名称冲突,this.
是多余的。只有当您需要对当前对象的引用或者您有一个与字段同名的参数时,才需要它。
线程问题与它无关。混淆可能来自这样的事实:大多数静态成员都是实现的,因此它们是线程安全的,静态成员不能用this.
调用它们,因为它们没有绑定到实例。
答案 1 :(得分:8)
“不使用this.xxx创建线程 问题“
是一个完整的神话。只要求你的同事检查生成IL并让他解释为什么它们是相同的,无论你是否添加this
。
“在课堂内使用此项,例如 if(this._a == 2)“
取决于你想要达到的目标。你的同事似乎在说什么总是引用私人领域,这在我看来并不合理。通常你想访问 public 属性,甚至是在类中,因为getter可能会修改值(例如,当列表为null时,类型为List的属性可能返回一个新的List实例以避免访问属性时出现空引用异常。)
答案 2 :(得分:4)
我个人的“最佳实践”是始终使用它。是的,这是多余的,但是当您考虑多线程应用程序时,从第一个外观中识别实例状态被查找或检索的方法很棒。
答案 3 :(得分:3)
向您的同事询问为什么他认为这些建议是最佳做法可能会有所帮助?通常人们会引用他们在某个地方找到的最佳实践“规则”而没有真正理解这些实践背后的原因。
正如Lucero所说,除非()存在名称冲突,否则不需要“this”。然而,有些人喜欢在没有严格要求的情况下加入“this”,因为他们认为它提高了可读性/更清楚地显示了程序员的意图。在我看来,这是个人偏好而不是其他任何事情。
对于“Bar”方法中的“坏主意”:您的同事可能会因为以下原因而考虑这种不良做法:如果“A”的setter方法被更改为有一些副作用,那么 A = a; 也会产生这种副作用,而 _a = a; 只会设置私有变量。在我看来,最佳实践是了解差异,而不是偏爱另一个。
最后,“线程问题”是无意义的 - AFAIK“this”与线程无关。
答案 4 :(得分:2)
数字2是一个神话,通过提及自动属性很容易被揭穿。 Automatic properties允许您定义没有由编译器自动生成的支持字段的属性。所以问你的同事他对自动属性的看法是什么。