c#封装获取/设置

c#封装获取/设置,c#,get,set,encapsulation,C#,Get,Set,Encapsulation,正在查找有关获取/设置的澄清。我有这个代码,我用它来创建我的对象。不过,我想对长度和宽度进行一些验证(例如,两者都需要大于某个数字)。我相信Get/Set是一种方法,我在实例中更改字段时使用过它,但是在实例化阶段我该如何做呢 class Room { public Double dblLength; public Double dblWidth; public Room (Double _dblLength, Double _dblWidth) {

正在查找有关获取/设置的澄清。我有这个代码,我用它来创建我的对象。不过,我想对
长度
宽度
进行一些验证(例如,两者都需要大于某个数字)。我相信Get/Set是一种方法,我在实例中更改字段时使用过它,但是在实例化阶段我该如何做呢

class Room
{
    public Double dblLength;
    public Double dblWidth;

    public Room (Double _dblLength, Double _dblWidth)
    {

        dblLength = _dblLength;
        dblWidth = _dblWidth;
    }
把土地变成财产;在相应的
集合中执行验证

class Room
{
    private Double m_DblLength;
    private Double m_DblWidth;

    public Room (Double _dblLength, Double _dblWidth) {
      DblLength = _dblLength;
      DblWidth = _dblWidth;
    }

    public Double DblLength {
      get {
        return m_DblLength;
      }
      set {
        //TODO: validation here
        if (value < 0)
          throw new ArgumentOutOfRangeException("value"); 

        m_DblLength = value;
      }
    }

    public Double DblWidth {
      get {
        return m_DblWidth;
      }
      set {
        //TODO: validation here
        if (value < 0)
          throw new ArgumentOutOfRangeException("value"); 

        m_DblWidth = value;
      }
    }
教室
{
私人双m_DblLength;
私人双m_DblWidth;
公共房间(双长双宽){
DblLength=_DblLength;
DblWidth=_DblWidth;
}
公共双数据长度{
得到{
返回m_DblLength;
}
设置{
//TODO:这里是验证
如果(值<0)
抛出新ArgumentOutOfRangeException(“值”);
m_DblLength=值;
}
}
公共双DblWidth{
得到{
返回m_DblWidth;
}
设置{
//TODO:这里是验证
如果(值<0)
抛出新ArgumentOutOfRangeException(“值”);
m_DblWidth=值;
}
}
将字段转换为属性;在相应的
集合中执行验证:

class Room
{
    private Double m_DblLength;
    private Double m_DblWidth;

    public Room (Double _dblLength, Double _dblWidth) {
      DblLength = _dblLength;
      DblWidth = _dblWidth;
    }

    public Double DblLength {
      get {
        return m_DblLength;
      }
      set {
        //TODO: validation here
        if (value < 0)
          throw new ArgumentOutOfRangeException("value"); 

        m_DblLength = value;
      }
    }

    public Double DblWidth {
      get {
        return m_DblWidth;
      }
      set {
        //TODO: validation here
        if (value < 0)
          throw new ArgumentOutOfRangeException("value"); 

        m_DblWidth = value;
      }
    }
教室
{
私人双m_DblLength;
私人双m_DblWidth;
公共房间(双长双宽){
DblLength=_DblLength;
DblWidth=_DblWidth;
}
公共双数据长度{
得到{
返回m_DblLength;
}
设置{
//TODO:这里是验证
如果(值<0)
抛出新ArgumentOutOfRangeException(“值”);
m_DblLength=值;
}
}
公共双DblWidth{
得到{
返回m_DblWidth;
}
设置{
//TODO:这里是验证
如果(值<0)
抛出新ArgumentOutOfRangeException(“值”);
m_DblWidth=值;
}
}

如果您的类是不可变的,最简单的方法是:

class Room
{
    public double Length { get; }
    public double Width { get; }

    public Room(double length, double width)
    {
        // Validation here, for instance throw exception if length <= 0
        Length = length;
        Width = width;
    }
}
教室
{
公共双长度{get;}
公共双宽度{get;}
公共房间(双倍长、双倍宽)
{

//这里的验证,例如,如果长度抛出异常如果您的类是不可变的,最简单的方法是:

class Room
{
    public double Length { get; }
    public double Width { get; }

    public Room(double length, double width)
    {
        // Validation here, for instance throw exception if length <= 0
        Length = length;
        Width = width;
    }
}
教室
{
公共双长度{get;}
公共双宽度{get;}
公共房间(双倍长、双倍宽)
{

//这里的验证,例如,如果长度则抛出异常这是一个基于Alex评论的示例。就我个人而言,我也会去掉下划线和'dbl'前缀,但我保留了它们以匹配问题

无法从构造函数返回失败消息,因此引发异常

class Room
  {
  private Double dblLength;
  private Double dblWidth;

  public Room (Double _dblLength, Double _dblWidth)
  {
    if (_dblLength < _dblWidth)
    {
        throw new ArgumentException("length must be more than width");
    }

    dblLength = _dblLength;
    dblWidth = _dblWidth;
  }
}
教室
{
私人双dblLength;
私人双dblWidth;
公共房间(双长双宽)
{
如果(_dblLength<_dblWidth)
{
抛出新ArgumentException(“长度必须大于宽度”);
}
dblLength=_dblLength;
dblWidth=_dblWidth;
}
}
如果这表明使用您的类的程序员不理解它,那么这是合适的。但是,如果在运行时很有可能发生这种情况,那么最好在对象中设置一个“hasError”标志,以防止保存它,或者执行它所做的任何操作

  class Room
  {
    private Double dblLength;
    private Double dblWidth;

    public bool HasError {get;}

    public Room (Double _dblLength, Double _dblWidth)
    {
      if (_dblLength < _dblWidth)
      {
          HasError = true;
      }

      dblLength = _dblLength;
      dblWidth = _dblWidth;
    }

    public Save()
    {
        if (HasError) return;
        // Otherwise do the save;
    }
}
教室
{
私人双dblLength;
私人双dblWidth;
公共bool hasrerror{get;}
公共房间(双长双宽)
{
如果(_dblLength<_dblWidth)
{
hasrerror=true;
}
dblLength=_dblLength;
dblWidth=_dblWidth;
}
公共储蓄
{
if(hasrerror)返回;
//否则,请执行保存操作;
}
}

以下是一个基于Alex评论的示例。就我个人而言,我也会去掉下划线和'dbl'前缀,但为了匹配问题,我将它们保留了下来

无法从构造函数返回失败消息,因此引发异常

class Room
  {
  private Double dblLength;
  private Double dblWidth;

  public Room (Double _dblLength, Double _dblWidth)
  {
    if (_dblLength < _dblWidth)
    {
        throw new ArgumentException("length must be more than width");
    }

    dblLength = _dblLength;
    dblWidth = _dblWidth;
  }
}
教室
{
私人双dblLength;
私人双dblWidth;
公共房间(双长双宽)
{
如果(_dblLength<_dblWidth)
{
抛出新ArgumentException(“长度必须大于宽度”);
}
dblLength=_dblLength;
dblWidth=_dblWidth;
}
}
如果这表明使用您的类的程序员不理解它,那么这是合适的。但是,如果在运行时很有可能发生这种情况,那么最好在对象中设置一个“hasError”标志,以防止保存它,或者执行它所做的任何操作

  class Room
  {
    private Double dblLength;
    private Double dblWidth;

    public bool HasError {get;}

    public Room (Double _dblLength, Double _dblWidth)
    {
      if (_dblLength < _dblWidth)
      {
          HasError = true;
      }

      dblLength = _dblLength;
      dblWidth = _dblWidth;
    }

    public Save()
    {
        if (HasError) return;
        // Otherwise do the save;
    }
}
教室
{
私人双dblLength;
私人双dblWidth;
公共bool hasrerror{get;}
公共房间(双长双宽)
{
如果(_dblLength<_dblWidth)
{
hasrerror=true;
}
dblLength=_dblLength;
dblWidth=_dblWidth;
}
公共储蓄
{
if(hasrerror)返回;
//否则,请执行保存操作;
}
}

您可以将字段更改为。将字段更改为属性后,您可以验证将设置为相应属性的
值,如果该值不符合要求,则可以引发异常

class Room
  {
  private Double dblLength;
  private Double dblWidth;

  public Room (Double _dblLength, Double _dblWidth)
  {
    if (_dblLength < _dblWidth)
    {
        throw new ArgumentException("length must be more than width");
    }

    dblLength = _dblLength;
    dblWidth = _dblWidth;
  }
}
例如:

class Room
    {
        private double _dblLength;
        private double _dblWidth;

        public double DblLength {
            get
            {
                return _dblLength;
            }
            set
            {
                //TODO -> Do validation
                //the keyword value represents the value that you want to pass to the property
                if(value < 0)
                {
                    throw new ArgumentOutOfRangeException("message");
                }

                _dblLength = value;
            }
        }
        public double DblWidth
        {
            get
            {
                return _dblWidth;
            }
            set
            {
                //TODO -> Do validation
                //the keyword value represents the value that you want to pass to the property
                if (value < 1)
                {
                    throw new ArgumentOutOfRangeException("message");
                }

                _dblWidth = value;
            }
        }

        public Room(Double _dblLength, Double _dblWidth)
        {
            DblLength = _dblLength;
            DblWidth = _dblWidth;
        }
    }   
这是可能的,因为属性只是C#提供给我们的语法糖。编译此代码时,编译器将为每个属性创建两个方法
Get
Set
。因此,如果您在getter或setter上放置一个访问修饰符,编译器将记住这一点,并且在编译代码时,它将您已指定的标识符。但是,如果未指定特定的修饰符,编译器将采用属性本身的修饰符。在上述情况下,
Get
方法将是公共的,
Set
方法将是私有的。编译后,代码将看起来像