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
方法将是私有的。编译后,代码将看起来像