C#重启 --- 类和对象

​​​​​​

1.类是抽象的,对象是具体的

2.类中有数据成员和方法成员(数据成员是名词性的,方法成员是动词性的)

1.类的关键字是class

(变量:首字母小写,方法:首字母大写,类名:首字母大写)

2.类成员包含方法成员和数据成员

3.在创建一个新的类前都需要先创建一个C#源文件来容纳这个类

4.枚举是值数据类型,类是引用数据类型

数据成员的三种级别: protect,private,public

1.在C#中,如果我们没有在数据成员前面规定访问权限的话,则默认这个数据成员的访问权限为private

2.在Unity开发中,规定每一个数据成员前面都必须写上访问权限,方便代码的阅读(哪怕是private也不能省略,必须写上)

1.方法成员的返回类型前面也需要写上对应的访问权限

2.在方法中我们可以通过 this + 点操作符 + 数据成员名的方式访问和修改调用方法的对象的对应的数据成员

 

1.第一步:在栈区中声明类型的引用(用于接收堆区地址)

2.第二步:在堆区中实例化对象(根据类给定的数据成员开辟内存空间),并将地址返回给我们在栈区中声明的引用

(在我们实例化了一个对象后,在堆区中开辟的内存空间大小由对象所对应的类中有那些数据成员来决定)

1.在栈区中我们创建类型的引用,用来指向堆区中实例化的对象(接收内存地址),在堆区为对象开辟的内存空间中会具有它所对应的类型中所有数据成员的拷贝

在堆区中实例化的对象内存空间(由三部分组成:根据类型拷贝过来的数据成员,类型对象指针(我们用不到,C#内部自己调用),同步块索引(以后讲同步操作的时候才会用到))

1.可以与局部变量重名的意思是类中的成员变量能够与在方法中创建的局部变量重名

 当发生重名情况时,有以下几点需要我们注意:

1.如果方法中没有与成员变量重名的局部变量时,我们通过变量名访问和操作到的就是成员变量

2.当方法中存在与成员变量重名的局部变量时,我们通过变量名访问和操作到的变量遵循就近原则,离谁近就访问谁

3.当我们通过变量名将成员变量赋值给与其重名的局部变量(或者是反过来时),我们可以通过this指针来实现区分并进行访问(this + 点操作符 + 变量名访问到的就是成员变量)

4.之所以能够重名的原因是,成员变量开辟在堆中,局部变量开辟在栈中

(关于引用类型和值类型我们需要记住的是,无论引用类型数据开辟在堆区中还是开辟在栈中,为其开辟的内存空间中存储的都是引用(地址),而值类型则是直接存储数据)


访问权限讲解

1.private访问权限 --- 被这个访问权限修饰的成员变量和成员函数只能够在类中被调用和访问,无法被外界调用和访问

2.public访问权限 ---  被这个访问权限修饰的成员变量和成员函数无论是在类外还是在类内都能被访问和操作

3.一般来说所有的成员变量都会被设置为私有权限,防止数据被意外修改,与此同时我们都会对每一个成员变量分别设置两个接口(方法) ---- 一个是接收接口,另一个是输出接口

通过接收接口(方法,通过内部调用的方式访问具有私有权限的成员变量)用户可以向成员变量数据,同时我们也可以在方法(接口)中对用户输入的数据进行各种判断,保证输入的数据的正确性

而通过输出接口我们就可以将具有私有权限的成员变量的数据进行输出了

此时问题又来了,每一次创建一个成员变量都需要配置两个接口(创建两个方法),这实在是太麻烦了,那么有没有什么能够实现一样的效果但是更方便呢?

答案是有的,这就是C#中的属性

1.首先在C#中成员变量被称为字段

1.属性的权限一般都是public --- 或者说属性就是用来给外界访问的

2.为一个已经创建好的成员变量(字段)创建属性的语法是 puclic + 成员变量的数据类型 + 成员变量名(首字母大写版本),然后就是 { } 以及里面的 get 和 set

3.属性里的 get 和 set 的本质就是我们上面创建的两个接口(方法) --- 输入接口和输出接口

gei 对应的是输出接口 ; set 对应的是输入接口

1.在属性的set中 value 用来接收用户传进来的值,并且当我们把value赋值给变量的时候就相当于我们将用户传进来的值赋值给变量了

1. 调用属性接收数据,并在属性中传给具有私有权限的成员变量

2.每一个成员变量都能够设置一个对应的属性,属性名是成员变量名的首字母大写版本(属性的创建方法在上面有)

1.使用属性的时候,如果我们在属性中没有添加 get 方法的话,则对应的具有私有属性的成员变量的数据将无法对外界进行输出,如果没有set方法的话,则是无法接收外界的输入

2.set中可以没有return,get中一定要有return,不然的话就会报错

3.在属性的get中如果返回属性自身的话会造成栈溢出

 

1.如果类中具有了构造函数的话,编译器就不会再提供默认的无参数构造函数了

2.构造函数也可以进行函数重载操作(方法名相同,参数列表不同就能够进行函数重载)

3.构造函数访问权限也可以是private,此时构造函数只能够在类内调用,不能够在类外调用,也就是说我们只能够在类内调用构造函数实例化对象(PS:由于类中已经有了构造函数了,所以不会出现默认构造函数)

1.上面这个几个引用的意思是:其下面的方法(函数)被调用了几次

2.点开这个白色的引用后就会出现一个窗口展示调用函数的所有代码所在的位置

3.构造函数的本质就是方法

4.构造函数在对象被创建的时候会自动调用,不能够手动调用

1.如果想在一个构造函数A在被自动调用的同时调用另一个构造函数B的话,我们可以通过在构造函数A的括号后加 : 再加 this + (构造函数B的形参列表)  这个语法实现

2.注意!如果采用上面这种方法的话,构造函数的执行顺序是先执行构造函数B,然后再去执行构造函数A

3.构造函数就是一个方法,但是没有返回值,而且只能自动调用(在new实例化对象的时候自动调用,我们不能够手动调用)

4.创建一个类所需要的构造函数由需求来决定 

构造函数特点总结

 

 类和对象也能够使用数组数据结构,上图就是创建一个数组,里面装的都是同一类的对象

数组的元素个数等于数组的长度,通过点操作符来调用 Lenght 属性可以访问得到元素个数12

 1.类中有字段,与字段对应的属性,构造函数以及方法

1.创建一个自动属性的时候,就相当于我们创建了一个字段以及一个get方法和set方法

这样自动属性中的get方法是固定的,我们无法改变,访问这个自动属性的时候就会调用get方法,返回对应字段中的数据

set方法也同理,会自动调用已经定好的set方法,将传过来的值赋值给value,然后再赋值给对应字段

2.一旦用户自己创建了构造函数,编译器就不会提供默认的无操作构造函数了,此时我们只能够调用自己创建的构造函数

3.每当我们在堆区中实例化一个对象的时候,都需要调用构造函数

如果我们没写的话就是调用系统提供的默认构造函数,如果我们写了的话就会调用我们写的构造函数,此时系统不会提供默认的构造函数(当然不可能调用我们没写的构造函数)

上面是数组比较麻烦的两个必须,有时候我们就是不知道数组的大小,或者是要查找的元素的下标,这就很麻烦,为了解决这个问题我们可以通过自己创建类的方式获得一个更方便的“数组类 ”


C# 泛型 集合类

 

1. List是C#提供给我们的一个类,这个类的作用是在我们输入数据类型后帮我们生成一个对应数据类型的,具有更多功能的升级版数组。

2.使用这个类的时候有一个需要特别注意的点是我们需要在泛型括号中 <> --- 也就是两个尖括号中写入我们要创建的升级版数据的数据类型

3.在这个类中提供了两种构造函数(目前已知的,肯定还有更多的),一种是无参构造函数,上图就是无参构造函数,调用这个函数的时候会创建一个具有默认元素大小空间的数组

还有一种是有参构造函数,其参数是 int 类型,用来自定义升级版数组的大小

4.通过这个类实例化的升级版数组对象中内置了很多的方法(插件)供我们使用

通过List类实例化的升级版数组对象可以通过索引 + 下标引用操作符来访问数组中对应索引的元素 

1.字典集合,其实就是键值对集合

2.使用它的语法是通过 Dictionary 关键字实例化一个对象,实例化的时候我们需要在类的后面使用泛型尖括号规定键值的数据类型和存储在集合中的元素的数据类型

(PS:new的时候也需要这么做,且键值的数据类型和元素的数据类型要和类处定义的一样)

3.存储一个元素到我们创建的字典集合对象的时候要调用Add方法,这个方法中需要我们传两个参数,一个是我们自定义的和要存储的元素绑定的键值,另一个就是我们要存储的元素了

(元素的数据类型以及键值的数据类型都在我们创建字典集合的时候就规定好了)、

4.字典集合和List集合的区别是 --- 字典集合查找的速度快,但是存储一个元素占用的空间大;

List集合的特点是存储一个元素占用的空间少,但是查找速度慢

(当我们只是单纯的存储数据,且这些数据被查找的次数小的话就使用List集合 ; 如果我们存储的数据要被频繁的查找的话,就用字典集合)

猜你喜欢

转载自blog.csdn.net/qq_51947882/article/details/127836556
今日推荐