【问题标题】:C# myths about best practices?关于最佳实践的 C# 神话?
【发布时间】:2010-04-12 11:09:26
【问题描述】:

我的同事一直告诉我 cmets 中列出的东西。

我很困惑。 有人可以为我揭开这些东西的神秘面纱吗?

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
}

【问题讨论】:

    标签: c# .net .net-2.0 c#-2.0


    【解决方案1】:

    如果没有名称冲突,this. 是多余的。只有在需要引用当前对象或有与字段同名的参数时才需要它。

    线程问题与此无关。混淆可能来自这样一个事实,即大多数静态成员都是线程安全的,而静态成员不能(!)使用this. 调用,因为它们没有绑定到实例。

    【讨论】:

    • 谢谢卢塞罗!这肯定会在我们下次的会议对抗中有所帮助;)
    • 我认为这应该是为了好的目的而不是对抗。
    • @Muhammad Kashif Nadeem:知识是一把双刃剑。它的用途取决于拥有它的人!开个玩笑:D
    • 静态字段和属性本质上不是线程安全的。方法通常只要它们不使用存储在静态字段/属性中的任何状态。如果正确使用监视器和锁,属性和方法会更加线程安全。
    • @Matthew Whited,或结构合理的无锁算法(比使用监视器或锁要快得多,但只在时间紧迫的场景中需要)
    【解决方案2】:

    "不使用 this.xxx 创建线程 问题”

    是一个完整的神话。只需让您的同事检查生成的 IL,并让他解释为什么无论您是否添加 this,它们都是相同的。

    "在课堂上使用这个,例如 if(this._a == 2)"

    取决于您想要实现的目标。您的同事似乎在说总是引用私有字段,这在我看来并不明智。通常你想访问 public 属性,即使是在一个类中,因为 getter 可能会修改值(例如,当列表为 null 时,List 类型的属性可能会返回一个新的 List 实例以避免访问属性时出现空引用异常)。

    【讨论】:

    • "总是引用私有属性" --> 我认为你的意思是私有 field - 它不是一个属性。
    • 你说得很对 Lucero - 我已经编辑了我的答案以反映这一点。谢谢。
    • 另外,OP,想象一下 this._a = -2; 使用像 public int A { get { return _a; } set { if(value < 0) throw new ArgumentOutOfRangeException(); _a = value; } } 这样的属性
    【解决方案3】:

    我个人的“最佳实践”是始终使用它。是的,它是多余的,但是当您考虑多线程应用程序时,它是从第一次查看实例的状态被更改或检索的位置来识别的好方法。

    【讨论】:

    • this. 是我很高兴在我的代码中看到的第一大“噪音”。大多数时候,我尝试尽可能多地消除噪音(额外的大括号、嵌套的if 块等)
    • 这也是 StyleCop 推荐的
    • 但是this._athis.A 怎么用?
    • 我喜欢 StyleCop 给我的约束。 StyleCop 强制我们总是在实例字段上使用this.。我喜欢这种“噪音”。
    • 有趣的是,ReSharper 建议相反(删除this.
    【解决方案4】:

    询问您的同事为什么他认为这些建议是最佳实践可能会有所帮助?人们经常引用他们在某个地方找到的最佳实践“规则”,而没有真正了解这些实践背后的原因。

    正如 Lucero 所说,“this”不是必需的,除非 () 存在名称冲突。但是,有些人喜欢在没有严格要求时包含“this”,因为他们认为它增强了可读性/更清楚地显示了程序员的意图。在我看来,这是个人喜好问题,而不是其他问题。

    至于“Bar”方法中的“坏主意”:您的同事可能会考虑这种不好的做法,原因如下:如果将“A”的 setter 方法更改为产生一些副作用,那么 A=a; 也会产生这种副作用,而 _a = a; 只会设置私有变量。在我看来,最佳实践是意识到差异而不是偏爱一个而不是另一个。

    最后,“线程问题”是无稽之谈 - AFAIK “this”与线程无关。

    【讨论】:

      【解决方案5】:

      数字 2 是一个神话,很容易通过提及自动属性来揭穿。 Automatic properties 允许您定义一个没有编译器自动生成的支持字段的属性。所以问问你的同事他对自动属性的看法。

      【讨论】:

      • 除此之外,通过使用#2,您会丢失 getter 中的任何可能的业务逻辑(现在或将来)。有时我使用我的 getter 来应用默认值。比如如果 backing 字段为 null,则创建一个新实例,存储到 backing 字段,然后返回新值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多