C#(9):字段,属性,索引器
函数体中的变量是局部变量
字段的修饰符
属性是为了简略字段的set()get()方法而发明的,可以起到同样的避免直接使用字段赋值来暴露数据的问题
将属性封装成(refactory)属性方法的方法:ctrl +r e
只读方法只有get(){}而没有set(){}
注意:只读方法属性和private set(){}的区别,只读属性无论方法内还是方法外都无法修改数据并且没有set(){},而private set(){}在方法属性中有private set(){},其无法在该类方法体外对其进行赋值,只能在方法体内部进行赋值,其并不是只读属性
set => age = value;这种写法和setter有什么区别吗
在 C# 中,它们实际上没有太大的区别,它们都是设置属性的访问器(setter)。这两种写法都是在给属性赋值。
`set => age = value;` 是C# 7.0中引入的新语法,称为 "Expression-bodied members"。这是写属性setter的简洁方式。
传统的 setter 方法:
...
```
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
```
可以被简化为:
...
```
private int age;
public int Age
{
get => age;
set => age = value;
}
```
但是,如果你的 setter 中除了设置属性值还要执行其他代码(例如调用其他方法),那么你还是必须使用传统的 getter/setter 写法。例如:
...
```
private int age;
public int Age
{
get
{
return age;
}
set
{
age = value;
this.canWorkCalculator();
}
}
```
动态计算值的属性
public class people
{
private int age;
//封装字段
public int Age {
get { return age; }
set { age = value;
//设定age时自动给canWork赋值,根据访问情况决定是访问时实时计算还是设定时计算
this.canWorkCalculator();
}
}
private bool canWork;
public bool CanWork {
get => canWork;
//改为只读属性
}
private void canWorkCalculator() {
if (this.age >= 18)
{
this.canWork = true;
}
else
{
this.canWork= false;
}
}
}
`this`方法在C#中被称为索引器(Indexer)。它允许一个对象像数组一样通过索引进行访问,提供了一种类似数组的方便访问方式。
在这段代码中,`this`方法对字符串参数`subject`进行了重载,使得可以通过[subject]这样的形式来获取或设置与某个`subject`相对应的成绩(比如`scores["Math"] = 95;`或`int mathScore = scores["Math"];`),增强了类的易用性。如果`subject`不存在,该函数会返回null。