一、成员方法
成员方法的申明
基本概念
成员方法(函数)用来表现对象行为
1.申明在类语句块中
2.用来描述对象的行为
3.规则和函数申明规则相同
4.受到访问修饰符规则影响
5.返回值参数不做限制
6.方法数量不做限制
注意
1.成员方法不要加static关键词 //static 静态
2.成员方法 必须实例化出对象 再通过对象来使用 相当于该对象执行了某个行为
3.成员方法 受到访问修饰符影响
成员方法的使用
例子:
class Person
{
public string name;
public int age;
朋友们
public Person[] friends;
说话的行为
public void Speak(string str)
{
Console.WriteLine("{0}说{1}", name, str);
}
添加朋友的方法 参数p是传入的新朋友
public void AddFirend(Person p)
{
if(friends == null)
{
friends = new Person[] { p };
}
else
{
新建一个 房子数组
Person[] newFriends = new Person[friends.Length + 1];
for (int i = 0; i < friends.Length; i++)
{
newFriends[i]= friends[i];
}
把新加的朋友放到最后一个
newFriends[newFriends.Length - 1] = p;
地址重定向
friends = newFriends;
}
}
Person p = new Person();
p.name = "sdada";
p.age = 27;
p.Speak("我爱你");
if (p.IsAdult())
{
p.Speak("我要睡大觉");
}
Person p2 = new Person();
p2.name = "火星人";
p2.age = 22;
p.AddFirend(p2);
二、构造、析构函数
构造函数基本概念
基本概念
在实例化对象时 会调用的用于初始化的函数
如果不写 默认存在一个无参构造函数
类 中允许存在无参构造函数 而 结构体 不允许
构造函数的写法
1.没有返回值
2.函数名和类名必须相同
3.没有特殊需求时 一般都是public的
4.构造函数可以被重载
5.this代表当前调用该函数的对象自己
注意:
如果不自己实现无参构造函数而实现了有参构造函数
会失去默认的无参构造函数
构造函数的特殊写法
通过this重构构造函数代码
访问修饰符 构造函数名(参数列表):this(参数1,参数2,。。。)
public Person()
{
name = "计算机";
age = 18;
}
public Person(int age,string name):this() 只要看到构造函数后面带冒号,
那么意味着会先调用一个另外的重载构造函数
不管是有参数还是没有参数
{
this代表当前调用该函数的对象自己
Console.WriteLine("Person两个构造函数调用");
}
析构函数
就算写了 也是当引用类型的堆内存被回收时才会触发
~Person()
{
}
引用值类型在栈中存储地址指向堆内存
当地址被清空为null时,指向 堆 的线断掉,无人使用的堆内存变成垃圾
但依然不会触发析构函数 因为此时垃圾未被回收
析构函数是垃圾被回收时才会触发
垃圾回收机制
垃圾回收,英文简写GC(Garbage Collector)
垃圾回收的过程是在遍历 堆(Heap) 上动态分配的所有对象
通过识别它们是否被引用来确定哪些对象是垃圾 ,哪些对象仍要被使用
所谓的垃圾就是没有被任何变量,对象引用的内容
垃圾就需要被回收释放
垃圾回收有很多种算法,比如
引用计数(Reference Counting)
标记清除(Mark Sweep)
标记整理(Mark Compact)
复制集合(Copy Collection)
注意
GC只负责 堆(Heap)内存的垃圾回收
引用类型都是存在 堆(Heap)中的,所以它的分配和释放都通过垃圾回收机制来管理
栈(Stack)上的内存是由系统自动管理的
值类型在栈(Stack)中分配内存,它们有自己的生命周期,不用对它们进行管理,会自动分配和释放
C#中内存回收机制的大概原理
0代内存 1代内存 2代内存
代的概念:
代是垃圾回收机制使用的一种算法(分代算法)
新分配的对象都会被配置在第0代内存中
每次分配都可能会进行垃圾回收以释放内存(0代内存满时)
在一次内存回收过程开始时,垃圾回收器会认为堆中全是垃圾,会进行以下两步
1.标记对象 从 根(静态字段、方法参数)开始检查引用对象,标记后为可达对象,未标记为不可达对象
不可达对象就认为是垃圾
2.搬迁对象压缩堆 (挂起执行托管代码线程) 释放未标记的对象 搬迁可达对象 修改引用地址
大对象总被认为是第二代内存 目的是减少性能损耗,提高性能
不会对大对象进行搬迁压缩 85000字节(83kb)以上的对象为大对象
每次释放都会消耗CPU 去计算,计算就会耗时或卡顿
手动触发垃圾回收 一般情况不会频繁调用
都是 Loading过场景的时候 才调用
GC比较耗性能大 可能会造成卡顿
GC.Collect();
本文介绍了C#中的成员方法,包括声明和使用方法的基本概念和注意事项。接着讲解了构造函数,包括其基本概念、特殊写法以及构造函数与析构函数的区别。析构函数在对象不再被引用时触发,垃圾回收机制负责管理堆内存,通过标记和清理算法回收无用对象。文章还概述了C#中内存回收的原理和代的概念。

被折叠的 条评论
为什么被折叠?



