【问题标题】:What is the difference between these two c# abstract classes? [closed]这两个c#抽象类有什么区别? [关闭]
【发布时间】:2015-03-11 13:14:58
【问题描述】:

所以我前几天在学习 c# 教程(仍然是初学者),我看到了 ATMState 类是如何定义的:

public abstract class ATMState
{
    private ATM atm;

    public ATM Atm
    {
        get { return atm; }
        set { atm = value; }
    }
    private int dummyCashPresent = 1000;

    public int DummyCashPresent
    {
        get { return dummyCashPresent; }
        set { dummyCashPresent = value; }
    }

    public abstract string GetNextScreen();
}

说实话,我觉得这些声明相当混乱,所以我决定以自己的方式重做:

public abstract class ATMState
    {
        public ATM Atm { get; set;  }
        public int DummyCashPresent { get; set; }

        public ATMState()
        {
            DummyCashPresent = 1000;
        }
        public abstract string GetNextScreen();
    }

有什么区别?哪个更好,为什么?

【问题讨论】:

  • 这个问题更适合CodeReview
  • 您的问题是关于添加构造函数还是自动属性?
  • 另请注意,C# 并不总是具有自动属性。该教程很可能是从那个时候开始的:)
  • “更好”是一个加载词。如果这意味着“在保留功能的同时更短”,那么您的第二个 sn-p 将获胜。如果它的意思是“可以用 C# 2.0 编译”,那么首先 sn-p 胜出。
  • 如果你将来扩展你的类,在属性设置器和属性获取器中添加一些逻辑,或者需要在你的类中访问原始属性值表单而不通过任何属性逻辑那么你需要带有支持字段的属性。

标签: c# abstract-class object-oriented-analysis


【解决方案1】:

有什么区别?

您使用的是“自动属性”,示例代码不是。也许该示例是在将自动属性引入 C# 之前编写的。

哪个更好,为什么?

通常自动属性更好:更紧凑的代码更难阅读和理解。如果您没有逻辑可以放入 getter 或 setter,您应该使用自动属性。

但是,目前1您不能在自动属性的 getter 或 setter 上设置断点,因此为了能够跟踪访问,有时需要使用显式的支持字段来中断。


1 我相信这会在 VS2015 中改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 2021-06-28
    • 1970-01-01
    • 2015-09-26
    • 2020-02-14
    • 2010-09-14
    相关资源
    最近更新 更多