在C#中我们可以任意的定义字段 但当我们想对字段做一些限制的时候 就需要用到属性了。
get
get
关键字在属性或索引器中定义访问器方法,它将返回属性值或索引器元素。
class Sample
{
private double _number;
public double Numbers
{
get { return _number; }
}
}
上面我们定义了 一个Numbers属性 以及 get访问器。它使用名为 _number
的私有字段备份属性值。
class Sample
{
private double _number;
public double Numbers
{
private get { return _number; }
}
}
通过上面的示例 我们可以通过属性对字段进行限制 只有内部成员才可以进项访问该字段。
以下示例将 get
访问器都作为 expression-bodied 成员实现。
class Sample
{
private double _number;
public double Numbers
{
get => _number;
}
}
set
set跟get的用法一样可以单独使用也可以一起使用下面我们封装一个set属性。
class Sample
{
private double _number;
public double Numbers
{
get => _number;
// 获取Nubers属性的时候把值乘10倍
set => _number = value * 10;
}
}
init
在 C# 9 及更高版本中,init
关键字在属性或索引器中定义访问器方法。 init-only 资源库仅在对象构造期间为属性或索引器元素赋值。 这会强制实施不可变性,因此,一旦初始化对象,将无法再更改。inti 只能在构造方法初始化的中使用 并且需要与get同时使用,下面我们举个例子。
class Sample
{
private double _number;
public double Numbers
{
get => _number;
init => _number = value;
}
}
class TestClass
{
Main(){
var sample = new Sample(){
Numbers = 1234;
};
// 下面写法是不被允许的 将不会通过编译
sample.Numbers = 56789;
}
}
总结
在C#中正常定义字段会直接将字段暴露给外界,将导致我们失去对该字段的控制权。我们可以通过封装属性的定义 来增加字段的安全性和控制。