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。

 

posted @ 2024-01-30 09:59  HY10-SALTEST-FISH  阅读(9)  评论(0编辑  收藏  举报