getter和setter的主要区别是什么?

时间:2014-05-15 07:03:03

标签: c#

我知道这可能是一个愚蠢的问题。我提到了一些文章。但是,我很有兴趣知道以下代码的主要区别,

using System;

namespace Business
{
    public class User
    {
        private int _id;

        public int ID
        {
            get { return _id; }
            set { _id = value; }
        }
    }
}

using System;

namespace Business
{
    public class User
    {
        public int ID { get; set; }
    }
}

我想知道一些简短的细节(任何参考资料)......

由于

5 个答案:

答案 0 :(得分:2)

在你的例子中没有区别。

但是,封装是面向对象编程的一个重要方面。你通常不希望有一个开放的setter。

namespace Business
{
    public class User
    {
        private int _id;

        public int ID
        {
            get { return _id; }
            set { 
              if (value <= 0) 
                   throw new ArgumentOutOfRangeException(value, "value", "Impossible value");

              _id = value; }
        }
    }
}

通过使用支持字段,您还可以确保在构造函数中指定了值:

namespace Business
{
    public class User
    {
        private AccountState _state;

        public User()
        {
            _state = AccountState.Active;
        }

        public AccountState State
        {
            get { return _state; }
            set { 
                 if (value == AccountState.Active && PasswordExpired)
                    throw new ArgumentException("Can not set active state when the password have expired");
                 _state = value; 
             }
        }
    }
}

答案 1 :(得分:1)

编译器没有任何区别,但代码存在差异。

您无法在自动属性上拦截setget,您可以在正常情况下执行此操作。如果您曾经使用过WPF,那么您会发现大量使用这种“普通”属性。

public int Data  {
    get {}  
    set {
       //Do something ehere
    }
}

这意味着您无法调试它们(自动属性)或将断点放入其中。

答案 2 :(得分:0)

编译后它们是相同的。

public int ID { get; set; }

只是&#34;语法糖&#34;。

这称为&#34; auto properties&#34;如果你有&#34;空的getter / setter&#34;并且非常有用的减少锅炉板代码。就像你的例子一样。

使用auto-property,您无法再直接访问后备字段,因为它仅在编译后才存在,如果JIT没有内联getter / setter,这可能会导致非常小的性能缺陷。

目前还没有办法直接初始化自动属性,但是对于即将推出的C#6,您可以执行以下操作:

public int ID { get; set; } = 0;

答案 3 :(得分:0)

自动实施的属性(http://msdn.microsoft.com/en-us/library/bb384054.aspx) 在C#3.0中引入,之前你必须使用你的第一个版本。

答案 4 :(得分:0)

引入了自动实现的属性以促进和简化:

private int _id;

public int ID
{
    get { return _id; }
    set { _id = value; }
}

进入这个:

public int ID { get; set; }

从编译器的角度来看,这两段代码是相同的。

但是,如果您想在属性中引入任何逻辑,那么自动实现的属性不是可行的方法。

例如,如果要验证id的提供值必须始终为非负值,则可以在setter中实现此逻辑,如下所示:

private int _id;

public int ID
{
    get
    {
        return _id;
    }
    set
    {
        if (value < 0)
        {
            throw new BusinessException("You must provide a non-negative number for ID.");
        }

        _id = value;
    }
}

使用自动实现的属性无法实现这种灵活性。