大家好,欢迎继续阅读我的笔记。昨天我们复习了数组,学习了集合和哈希表,大家还记得包含什么内容吗?如果有所遗忘的话记着及时复习哦,那今天我们就接着昨天的来。如果大家印象的话应该还记得,昨天我说今天要复习一下类,不知道大家还有没有印象吼吼,没事,我们开始吧!

1.类的创建

        我们来快速复习一下怎么创建一个类。之前我记录的只有代码里怎么写,这次我直接记录一下在编译器里怎么搞,给大家参考一下。

        首先,在我们创建完一个项目之后在我们的vs里就会有一个解决方案资源管理器,如图所示:

        然后,当我们想创建一个类的时候就可以对着我们的项目名称也就是我的evjob那一栏右键单击一下,就会得到很多的项目栏,然后我们找到添加,把鼠标放在上面,就会看到可以添加很多东西,我们找到类,点击即可。

        当我们按照上述方式操作完成之后就会跳转到添加类的界面,在这里我们需要输入我们要定义的类的名称,比如我们要定义一个学生类,就把那个名称改成Student,然后点击添加即可。不过在这里要注意,我们一般定义一个类的时候,类的名称的首字母一般都要大写,大家一定要养成这个习惯。

        之后我们就成功创建出一个类了!当然这个类也会在我们的evjob的文件下面,因为我们把类创建出来就是供别的文件调用的嘛。

        那看完怎么通过编译软件来定义一个类之后,我们来看看类里面要写点啥内容。我们之前也提到过,类里面包含了字段,属性,还有你定义的类的一些方法。我们暂时先不说其他方法,这里的方法我们先只提构造函数。

2. 字段

        字段是一种特殊的变量,一般就是用来记录我们这个类里共有的各个标识。比如我们之前定义了一个学生类,那我们学生的标识有啥,首先有学号吧,还得有姓名,性别,年龄,还得有专业等等,我们暂时只列这五条。每个学生都会有这五个条件,或者说是标识,这就是字段。

 public class Student
 {
     //字段:是一种特殊的变量  学号,姓名,性别,专业,年龄
     private int _id;
     private string _name;
     private string _gender;
     private string _major;
     private int _age;

 }

        上面代码里就是我们列出的各个字段。其中前面的private意思是私有的,说明这几个字段是只属于Stuedt这个类的。那为什么我们要这样定义?因为如果不把他设置成private,那他默认就是public,即为公共的。如果字段是公共的,那在我们的主函数里,没有任何的门槛,所有人都可以对这些字段进行修改,那我们这些信息是不是就变得不太安全了。正因如此,我们才需要把这些字段设置成私有,那么可能有同学就会思考到新的问题,那设置成私有,我们外部不能访问了,那我们怎么给他赋值呢?别着急,这里就需要用到我们下面要提到的属性。

3. 属性

       在C#中,属性是一种特殊的类成员,用于封装字段的访问逻辑。属性提供了灵活的机制来读取、写入或计算私有字段的值,同时可以添加验证逻辑或其他操作。那他怎么通过属性来控制私有字段的可访问性,来保护好内部的数据呢?就要通过他的两个访问器:get和set。get相当于一个读操作,定义读取时的逻辑。set相当于写操作,定义赋值时的逻辑。

public class Student
{
    //字段:是一种特殊的变量  学号,姓名,性别,专业,年龄
    private int _id;
    private string _name;
    private string _gender;
    private string _major;
    private int _age;

    //属性:get 读操作,set 写操作  =>控制私有字段的可访问性,保护好内部数据
    public int ID
    {
        get
        {
            return _id;
        }
        set
        {
            if(value <= 0)
            {
                _id = 1;
            }
            else
            {
                _id=value;
            }
        }
    }
    public string Name { get; set; }
    public string Gender { get; set; }
    public string Major { get; set; }
    public int Age 
    { 
        get
        {
            return _age;
        }
        set
        {
            if (value > 0 && value < 100)
            {
                _age= value;
            }
            else
            {
                _age=18;
            }
        }
    }




}

        我们接着字段的代码继续看。一般来说,我们的属性在定义的时候采用和字段同样的名字来对应,不过首字母要大写,这样在我们写代码的时候会比较方便。因为属性是用来让外部对内部字段信息访问的嘛,我们就可以看到我们所有的属性都是public。然后我们再来看看get和set。在我们不对get和set写入对应的逻辑,即他们像我们代码里的姓名性别和专业的时候,我们的编译器会自动生成默认的get和set访问器逻辑以及一个隐藏的私有字段。对于get来说,他会直接返回隐藏的后备字段的值,没有任何额外的逻辑或者条件限制;对于set来说它会将传入的值直接赋值给隐藏的后备字段,没有验证或者条件限制。

        接下来我们来看看学号和年龄这两个里面get和set的逻辑。首先我们假定学号是从1开始,默认都是正整数。我们要进行读操作的时候我们就直接返回字段里学号的值,我们要进行写操作的时候我们就进行一个判断,如果说给这个学生登记的学号不是一个正整数,那我们就默认把学号1给这个学生,如果是,那我们就把这个学号给这个学生用。同样,对于年龄来说,如果我们要进行读操作,我们就直接把这个学生的年龄输出出来;如果我们要进行一个写操作,我们就可以进行一个判断,如果说这个学生的年龄不在1-99之间,我们就默认他是18岁,如果这个学生的年龄在1-99之间,那他该是几岁就是几岁。这样我们也能避免一些输入时的离谱操作了。

4. 构造函数

        说完了字段和属性,我们就可以来看看剩下的最后以为成员---构造函数。构造函数是类中比较特殊的成员函数,主要用来对对象进行初始化如果一个类含有构造函数,在实例化该类的对象时就会调用。 构造函数的名字和类名相同。同时,构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。

        那我们怎么定义一个构造函数呢?

public class Student
{
    //字段:是一种特殊的变量  学号,姓名,性别,专业,年龄
    private int _id;
    private string _name;
    private string _gender;
    private string _major;
    private int _age;

    //属性:get 读操作,set 写操作  =>控制私有字段的可访问性,保护好内部数据
    public int ID
    {
        get
        {
            return _id;
        }
        set
        {
            if(value <= 0)
            {
                _id = 1;
            }
            else
            {
                _id=value;
            }
        }
    }
    public string Name { get; set; }
    public string Gender { get; set; }
    public string Major { get; set; }
    public int Age 
    { 
        get
        {
            return _age;
        }
        set
        {
            if (value > 0 && value < 100)
            {
                _age= value;
            }
            else
            {
                _age=18;
            }
        }
    }

   
    //构造函数:
    public Student(int id,string name,string gender, string major,int age)
    {
        ID = id;
        Name = name;
        Gender = gender;
        Major = major;
        Age = age;
    }


}

        我们接着上面的代码看,我们上面也说了,构造函数需要跟我们的类使用同一个名称,因为构造函数就是要构造出一个学生对象嘛,所以我们对这个构造函数传入我们要给学生的参数,包括学号啊,姓名啊,性别啊,专业啊,年龄啊,传进去之后我们可以看到我们这个构造函数的逻辑就是把你传入的东西给我们类里面的属性,通过属性完善了这个对象的信息。这就是构造函数,到这里,我们类的基础部分就已经完成了。

5.对象的声明

        ok啊,当我们完成了上面的全部步骤之后,我们就可以声明一个对象了。我们要明白,类的变量,就是对象。我们要声明一个对象的时候,就相当于我们定义了一个类的变量。至于方法的参数是啥,我们下次分解,这次我们先记住要传参就行。具体怎么做呢?我们看代码:

 //创建一个学生对象
 int id = 1;
 string name = "kyrie";
 string gender = "男";
 string major = "Artificial Intelligence";
 int age = 18;
 Student stu = new Student(id,name,gender,major,age); //定义一个学生对象
 Console.WriteLine($"我叫{stu.Name},今年{stu.Age}岁,{stu.Gender},我的学号是{stu.ID},我的专业是{stu.Major}");

        这里我们可以看到我们对构造函数里需要个各个参数均进行了赋值,然后在定义一个学生对象的时候把这些参数传入这个构造函数。这样我们的成功创建了一个学生对象。当我们像访问这个对象的一些属性时,只需要“对象名.属性”即可,就比如我那条打印语句。打印出来的结果如下:

       最后提一嘴,当我们同时定义多个对象的时候我们每定义一个就要new一次,当然这也就会很麻烦,这时候我们就可以结合之前的知识了,我们用一个循环,通过循环来实现定义多个对象。但这样就会又出现一个问题,就是定义的时候只有一条new语句,那会不会每一次循环new完对象就把之前的给覆盖掉呢?如果你想到这了,说明前面的掌握的确实不错,我们这会就可以再定义一个数组,每创建一个,我们就把他存在数组里,等创建完需要访问的时候我们通过数组的索引来打点访问就行。

        给大家留一个作业:先创建一个学生类,然后定义10个学生对象并填写信息,最后输出这十个学生对象。大家记着在评论区交作业哦!!!我们下次见!

更多推荐