定义类+类实例化+属性+构造函数+匿名类型var+堆与栈+GC回收机制+值类型与引用类型
为了让编程更加清晰,把程序中的功能进行模块化划分,每个模块提供特定的功能,而且每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会。 面向对象编程也叫做OOP编程 简单来说面向对象编程就是结构化编程,对程序中的变量结构划分,让编程更清晰。
类的概念:
类实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法。 类定义了类的每个对象(称为实例)可以包含什么数据和功能。
类中的数据和函数称为类的成员:数据成员 函数成员
数据成员: 数据成员是包含类的数据--字段,常量和事件的成员。
函数成员: 函数成员提供了操作类中数据的某些功能。(方法,属性,构造方法和终结器(析构方法),运算符,和索引器)
字段的声明:访问修饰符 类型 字段名称;
方法的声明:访问修饰符 返回值类型 方法名称(参数){ //方法体 }
定义一个类来表示一个顾客:
class Customer{ public string name; public string address; public int age; public string buyTime; public void Show(){ Console.WriteLine("名字:"+name); Console.WriteLine("年龄:"+age); Console.WriteLine("地址:"+address); Console.WriteLine("购买时间:"+buyTime); } } 在这里我们定义了一个类,叫做Customer(顾客),里面包含了四个字段,存储了顾客的名字,年龄,地址和购买时间,包含了一个Show()方法,用来输出自身的一些信息的,在这里Customer就是一个新的数据类型 类似于结构体的定义 struct Customer......;
如何利用类创建对象:
使用我们自定义的类声明的变量也叫做对象,这个过程也叫做实例化。
ClassName myClass = new ClassName();
其中ClassName是我们定义的类的名字,myClass是我们声明的变量(对象)的名字,后面的new是一个关键字,使用new 加上类型名()表示对该对象进行构造,如果不进行构造的话,这个对象是无法使用的。
构造函数:
我们构造对象的时候,对象的初始化过程是自动完成的,但是在初始化对象的过程中有的时候需要做一些额外的工作,例如需要初始化对象存储的数据,构造函数就是用于初始化数据的函数。
声明基本的构造函数的语法就是声明一个和所在类同名的方法,但是该方法没有返回类型。
public class MyClass{
public MyClass()
{ 这个构造函数的函数体 }
}
当我们使用new关键字创建类的时候,就会调用构造方法。 我们一般会使用构造方法进行初始化数据的一些操作。 构造函数可以进行重载,跟普通函数重载是一样的规则
注意: 当我们不写,任何构造函数的时候,编译器会提供给我们一个默认的 无参的构造函数,但是如果我们定义了一个或者多个构造函数,编译器就不会再提供默认的构造函数
属性的定义:
属性的定义结构:
public int MyIntProp{ get{ // get code } set{ //set code } }
1,定义属性需要名字和类型
2,属性包含两个块 get块和set块
3,访问属性和访问字段一样,当取得属性的值的时候,就会调用属性中的get块,所以get块,类型需要一个返回值就是属性的类型;
当我们去给属性设置值的时候,就会调用属性中的set块,我们可以在set块中通过value访问到我们设置的值。
通过属性来访问字段:
我们习惯上把字段设置为私有的,这样外界不能修改字段的值,然后我们可以通过定义属性来设置和取得字段中的值。
private int age; public int Age{//习惯上属性大写 字段小写 set{ if(value<0)return; age = value; } get{ return age; } }
设置属性的只读或者只写:
private string name; public string name{ get{ return name; } } 属性可以值只提供一个set块或者get块
属性的访问修饰符:
public string name{ get{ return name; } private set{ name = value; } }
自动实现的属性:
public int Age{get;set;} 编译器会自动创建private int age属性
匿名类型(var):
我们创建变量(对象的时候),必须指定类型,其实我们也可以不去指定类型,这个就是匿名类型,我们可以使用var声明一个匿名类型。 使用var声明的匿名类型,当初始化的时候,这个变量的类型就被确定下来,并且以后不可以修改。
var var1 = 34;
堆和栈 : 程序运行时的内存区域
我们把内存分为堆 空间和栈空间
栈空间比较小,但是读取速度快 堆空间比较大,但是读取速度慢
栈的特征: 数据只能从栈的顶端插入和删除 把数据放入栈顶称为入栈(push) 从栈顶删除数据称为出栈(pop)[后进先出]
堆是一块内存区域,与栈不同,堆里的内存能够以任意顺序存入和移除
GC Garbage Collector垃圾回收器:
CLR的GC就是内存管理机制,我们写程序不需要关心内存的使用,因为这些都是CLR帮我们做了。
值类型和引用类型:
类型被分为两种:值类型(整数,bool struct char 小数)和引用类型(string 数组 自定义的类,内置的类)。
值类型只需要一段单独的内存,用于存储实际的数据,(单独定义的时候放在栈中)
引用类型需要两段内存 第一段存储实际的数据,它总是位于堆中 第二段是一个引用,指向数据在堆中的存放位置
当我们使用引用类型赋值的 时候,其实是赋值的引用类型的引用 如果数组是一个值类型的数组,那么数组中直接存储值,如果是一个引用类型的数组(数组中存储的是引用类型),那么数组中存储的是引用(内存地址)