面向对象编程的思想是将一个问题抽象成多个类,然后每个类都解决自己的问题,大问题就被解决了,所以在c#中一般是一个类对应一个文件(当然一个文件也可以包含多个类,不过一般不这么用)
1.当一个类对应一个文件的时候,文件的名称要和文件中的类名对应一致
2.一个解决方案是用来解决一个问题的,而一个解决方案中可以有多个项目,每个项目都有一个属于自己的命名空间,每个命名空间中都有属于自己的类
其实可以理解为 --- 一个大问题(解决方案要解决的问题)分为了几个中问题(项目),而每个中问题又分为了几个小问题(类)--- 然后每个小问题(类)都有自己对应的文件,在这个文件中我们把小问题解决
所有小问题解决后 --- > 所有中问题解决 ---> 大问题解决
1. 类的创建方式和c++没有区别,都是 class + 类名{}
类中的成员属性和成员函数都需要有访问权限,在c#中类的访问权限是这样子加的:
对于成员属性:在成员属性的类型左边加上访问权限修饰
对于成员函数:在成员函数的返回类型左边加上访问权限修饰
2.处于同一个命名空间下的类可以相互调用和访问
3.通过类创建对象的语法:
类名 对象名 = new 类名(); --- 这种方式是在声明对象的同时定义了对象
整个创建过程也可以分为两步:
1.进行对象声明: 类名 对象名;
2.进行对象定义:对象名 = new 类名();--- 这个对象的定义也成为类的实例化 --- 即通过抽象的类实例化出一个具体的对象
3.通过对象访问成员变量和成员函数的方式和c++,c一样
4.可以给对象定义一个nullsh使其成为空对象,空对象是不能够进行成员函数和成员属性的访问的,因为它是一个空对象,而空对象其实就是没有对象。
5.类中的成员属性又称为称为成员变量,又称为域(又叫做字段)
6.private,protected,public等访问权限的作用依然没变
7.c#中的类也具有构造函数和析构函数,且规则和c,c++一样,分为无参构造函数,有参构造函数,拷贝构造函数,且这些构造函数的权限都是public,然后如果我们任意一种构造函数都没创建的话,则会有编译器内置的默认构造函数
如果我们创建了无参构造函数,则默认无参构造函数就无法调用
如果我们创建了有参构造函数,则默认无参和默认有参就无法调用
如果我们创建了拷贝构造(拷贝相同类型的对象),则默认无参,默认有参,默认拷贝(浅拷贝)都无法调用
8.c++中的类的成员函数中的this指针在c#被封装为了this对象,这个this对象就是当前调用该成员函数的对象,然后依然是在成员函数中使用,使用方法是this+点操纵符+成员名,如下图
属性
9.在类中,我们一般把成员变量的权限设置为private,并为其专门创建两个成员函数分别作为接收外界数据接口和向外界输出数据接口 --- 但是每一个成员成员变量都要这样搞的话实在是太麻烦了,于是c#将这两个操作封装为了属性,在下面这张图中我们就创建了一个Age属性
创建属性的语法:
访问权限 属性类型 属性名
{
get{} --- get就是向外界输出数据的函数的封装
set{} --- set就是接收外界输入数据的函数的封装
}
在get框中我们可以将成员变量输出到外界,在set框中我们可以让成员变量从外界接收数据
(图中就有接收操作)
在外界我们通过对象调用属性也有两种用途:
如果在调用属性后给属性赋值的话,属性就会自动执行set框中的代码
如果是调用属性给变量赋值的话,那么属性就会自动执行get框中的代码
(ps:一般一个成员变量对应一个属性,属性名是成员变量名的首字母大写版本(代码书写规范),然后在这个属性的get和set中实现读取成员变量值和给成员变量赋值的代码,或者是值判断等等)
(再补充一个知识点,get和set被称为访问器,然后这些访问器也是可以设置访问权限的,如果不设置的话会自动跟随属性的访问权限,如果设置了的话,就跟随自己的访问权限)
(再补充一个知识点,属性中可以只有get/set其中访问器,也可以两个都有 --- get(向外界输出数据),set(从外界获得数据))
(再补充一个知识点:,get和set也能像图中这样简写,简写后调用属性的话如果是get,那么编译器会去找与属性名首字母小写之后相同的成员变量名,并将其输出到外界,而set也差不多,只不过是输入进来,找的方式也一样)
(再补充一个知识点,甚至我们都不需要手动创建成员变量
直接写好属性,编译器就会自动在类中创建一个和属性类型相同,然后变量名是属性名首字母小写的变量(由于是自动创建所以我们看不到))
属性补充知识点;
在创建一个属性的时候,如果我们为其配置了set访问器的话,这个属性中就会自动创建一个和属性同类型的变量,这个变量是用来接收传给属性的值的,变量名统一为 value。
10.匿名类型
匿名类型用 var表示 (variable)
被匿名类型修饰的变量在被赋值前是没有类型的,在被赋值后该变量的类型就会与赋予它的值的类型相同 --- 如上面的age2被赋予45,则其age2类型变为整型
被匿名类型修饰的变量一旦被赋值确定了类型之后,它的类型就不能再改变了(即类型定死了)