C#核心(7-10)成员方法 构造、析构函数 垃圾回收

本文介绍了C#中的成员方法,包括声明和使用方法的基本概念和注意事项。接着讲解了构造函数,包括其基本概念、特殊写法以及构造函数与析构函数的区别。析构函数在对象不再被引用时触发,垃圾回收机制负责管理堆内存,通过标记和清理算法回收无用对象。文章还概述了C#中内存回收的原理和代的概念。

一、成员方法

成员方法的申明

    基本概念
    成员方法(函数)用来表现对象行为
    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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值