在学习C#时,发现了一个对于理解字段,属性,索引器较为通俗易懂的讲解,在这里分享出来和大家一起学习。
有一定编程基础的同学,推荐大家也看一看这位老师的视频,对面向对象的编程会有进一步的了解:刘铁猛《C#语言入门详解》全集_哔哩哔哩_bilibili
字段(成员变量)
实例字段:隶属于某个对象,表现对象当前状态;
静态字段:帮助数据类型储存数据,表达数据类型当前状态,由static修饰。
static void Main()
{
Student stu1 = new Student();
stu1.Age = 20;
stu1.Score = 80;
Student stu1 = new Student();
stu2.Age = 22;
stu2.Score = 78;
Student.ReportAmount();
//result: 2
List<Student>stuList = new List<Student>();
for(int i = 0; i < 100; i++)
{
Student stu = new Student();
stu.Age = 24;
stu.Score = i;
stuList.Add(stu);
}
}
class Student
{
//实例字段
public int Age;
public int Score;
//静态字段
public static int AverageAge;
public static int AverageScore;
public static int Amount;
//方法:将实例字段、静态字段关联起来
//实例构造器
public Student()
{
//每创建一个实例,Amount加一
Student.Amount++;
}
//静态构造器
public static Student(){}
public static void ReportAmount
{
Console.WriteLine(Student.Amount);
}
}
区别:实例字段的空间在实例创建时开辟;静态字段是在运行环境加载数据类型时开辟。
注意:
- 字段存在于类内,在构造体(函数)内的不是字段,因此字段不是语句,函数内的才是语句。
- 当数据类型被运行环境加载时,他的静态构造器调用。因为数据类型永远只会被加载一次,所以静态构造器永远只会执行一次。
属性
访问对象或类型的特征的成员,特征反映了状态,属性是字段的自然扩展。
例如:对象:mycar { oil=full },我的车是满油的,oil是属性;
类型:Student{ Amount = 10},学生10人,Amount是属性。
在C#中属性声明的两种形式:
//完整声明
class Student
{
//具有保护
private int age;
public int Age
{
get
{
return this.age;
}
set
{
if(value>=0&&value<=120)//value:上下文关键字,由Ms设置
{
this.age=value;
}
else
{
throw new Exception("Age Error");
}
}
}
}
//简略声明
class Student
{
public int Age{get; set;}
public int Amount{get;}//只读属性,只有get
}
索引器
索引器是成员,使对象能够用与数组相同的方式(即下标)进行索引。类似数组利用下标对数据进行区分与操作。
internal class Program
{
static void Main(string[] args)
{
student stu = new student();
var mathScore = stu["Math"];
Console.WriteLine(mathScore);//Math为空
stu["Math"] = 80;//Math已存在,Math的value设为80
Console.WriteLine(stu["Math"]);
Console.ReadKey();
}
}
class student
{
//索引器:通过学科Key(string), 索引学分Value(int)
private Dictionary<string, int>scoreDictionary = new Dictionary<string, int>();
public int? this[string subject]//int? 可null值类型
{
get
{
if(this.scoreDictionary.ContainsKey(subject))//是否存在这个科目
{
return this.scoreDictionary[subject];//存在,返回该学科的分数值int
}
else
{
return null;//不存在,返回学科null
}
}
set
{
if(value.HasValue == false)//如果value为null
{
throw new Exception("subject cannot be null");
}
if(this.scoreDictionary.ContainsKey(subject))
{
//如果找到科目:给subject赋值value
this.scoreDictionary[subject] = value.Value;
//null值直接进入索引器会引发错误
//value此处为可null值类型,value.Value才是value值
}
else
{
//如果没找到科目:创建新subject,赋值value
this.scoreDictionary.Add(subject, value.Value);
}
}
}
}
其中:type? 是可为空值null的数据类型,可表示其基础类型的所有值和额外的null值,例如可以将true,false,null任意一个指定给bool?,而基础类型bool本身不可能为null。