1 c#
我是一名 C# 初学者,过去几天我一直在研究面向对象。这就是为什么如果这个问题很愚蠢请原谅我。
我为一个类写了2个属性。谁能告诉我第一个和第二个的区别在哪里?
public class house
{
private int Height;
public int _Height
{
get { return Height; }
}
public int height { get; }
}
Run Code Online (Sandbox Code Playgroud)
之间有区别吗?
C# 知道字段和属性。字段存储数据,属性访问它。在基本形式中,如下所示:
public class House
{
private int _height; // a field storing an integer
public int Height // A property that can be used to access the _height field
{
get
{
return _height;
}
set
{
_height = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
对于外部观看者来说,以上内容(几乎)相当于:
public class House
{
public int Height; // a public field storing an integer
}
Run Code Online (Sandbox Code Playgroud)
但这是不鼓励的,因为字段不应该是公共的。如果你想稍后更改班级内的某些内容,那就会变得更加困难。
该属性具有不同的优点,其中之一是您可以在值更改时进行调试,或者可以验证该值是否在范围内(例如,没有人设置负高度)。您还可以保留设置器,这样类的用户只能读取该字段,但不能设置它。
由于属性在 C# 中非常常见,因此允许使用以下缩写:
public class House
{
public int Height // An auto-implemented property
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
这些属性称为自动实现的。同样,对于局外人来说,这看起来完全相同,并且编译器实际上将其转换为与上面第一个示例完全相同的代码。唯一的区别是您无法直接访问该字段。并且您无法使用此语法添加验证码。
所以基本上,这三种变体实现了几乎相同的结果,使用哪一种主要取决于品味问题。按照惯例,如果不需要进行验证,则主要使用最后一个变体,否则使用变体 1。
根据评论,这是一个经过验证的示例:
public class House
{
private int _height; // a field storing an integer
public int Height // A property that can be used to access the _height field
{
get
{
return _height;
}
set
{
if (value < 0)
{
throw new InvalidOperationException("The height of a house cannot be less than 0");
}
_height = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |