结构与类,类是存储在堆heap上的引用类型,结构是在栈stack上的值类型,结构不支持继承
类:
一、数据成员:字段,常量,事件的成员
二、函数成员:方法、属性、构造函数、终结器(析构函数)、运算符重载、索引器。
【1】方法
方法的申明[modifiers] return_type MethodName([parameters])
{
//method body
return data ;//or void
}
参数可以通过引用传递和值传递传递给方法
通过引用传递给方法的话,对象在方法内部发生的任何改变退出后任然有效(也就是传递的是指针)。
通过值传递则不会这样,被调用的方法得到的变量的一个相同副本,也就是退出后原值不会发生改变。
一些思考:其实被调用的方法都得到了一个副本,只不过引用方法得到了一个引用的副本,ps引用(也可以叫做别名)是值类型,所以我们可以这么理解,传入的形参其实都是值类型的副本。
如果想改变值类型怎么办呢
Ref和out out可以和c中的指针等效,因为都需要初始化值才能够使用,ref则需要初始化值就可以使用,out可以不初始化(请探讨out设计的目的,就是为了输出一个值,而ref是为了改变)
重载:声明参数数量或者参数类型不同的就好。
【2】属性
说白了。。就是两个变量和两个方法,两个变量:备用变量与value,方法get ,set
声明方法就是比字段多了一个大括号
原理:举例 属性 property 备用变量 _property
当property被赋值——value被赋值为property的值(value为set方法中的局部变量)——执行set事件中的代码。
当需要输出property的值时——执行get方法并且返回与之类型一样的变量
为什么要有局部变量,因为value是set内部的局部变量,需要保留value的值,所以便有了备用变量,所以很多时候,set第一步_property=value
(只读属性等,可以参照这两个方法的作用)
【2.5】索引器
出现这个的目的是为了更好地访问实例对象内部的数据,因为如此,所以必须是实例对象,而不能是静态对象。
申明方法
public int this[int a] 两个int均可更改。
{get;
set;}
原理和属性是一样的
使用方法 Person per=new Person(); Console.WriteLine(per[1]);per[1]=0;(不详细解释了,大致就是这个样子,内部也存在value这个东西!说白了。。和属性相比原理就是多传入了一个变量)
【3】构造函数
初始化所有值之后执行构造函数,这里没有什么好解释的
Ps静态构造函数
(所有静态几乎都是一个道理。。。只执行一遍,并且在所有实例化执行之前执行)
静态方法,也就是可以直接类名.调用的方法
构造函数可以调用其他构造函数
【ps】只读字段
Readonly,只能写一次
匿名类型 var
弱引用 使用WeakReference
WeakReference wangjiwr = new WeakReference(new property());
property wangji = wangjiwr.Target as property;
GC.Collect();
当类特别大的时候可以使用,这样可以让垃圾回收管理器回收空间
也是下次再调用的必须再次实例化一次
Ps所谓强引用就是property wangji = wangjiwr.Target as property;,这样是不会被回收的。
还有一个partial,就是可以在各个地方声明类的结构。
***结构***
Struct 优势,不在托管堆上,存储在栈中或存储为内联(inline)也就是,结构是值类型
所以,运行速度会快。
劣势,不支持继承 but 继承于object类