C#:字段,属性,索引器

         在学习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。

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值