C#学习笔记(1)

本文是C#学习笔记的第一部分,主要介绍了C#的访问权限,包括public、protected、private和internal等,讲解了程序集的构成如元数据、IL代码和资源,以及垃圾回收(GC)机制,特别是对象代龄的概念。同时,讨论了C#中指针的存在以及创建对象的注意事项,包括new关键字的使用和自动内存管理。

目录

using + namespace (命名空间)

c#访问权限

程序集

GC机制

  • using + namespace (命名空间)

相当于c++的头文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
  • 访问修饰符:指定类及其成员的访问规则(c++里面没有给访问修饰符的时候默认私有)

  • 类的默认访问修饰符是:internal

  • 成员的默认访问修饰符是:private(c++里面默认也是私有)

c#访问权限

  • public:公有的,能在任意程序集类中和类外访问

  • protected:受保护的,能在任意程序集的类中和子类中访问

  • private:私有的,只能在类中访问

  • internal:只能在当前程序集中的类中和类外访问

  • protected internal: == protected or internal :既可以在任意程序集中的类中和子类中访问,也可以在当前程序集中的类中和类外访问

程序集

  • 程序集的数据可以分为:类型元数据,程序元数据,IL代码,资源

  • 元数据:一般指的描述自身的数据

  • 类型元数据:记录了程序集引用了哪些类,用户自定义了哪些类,字段,属性,数据类型等一系列信息

  • 程序元数据:包含了程序集的版本信息,安全信息,签名等

  • IL代码:MSIL,C#->IL代码-》保存到程序集中,在被CLR加载-》由JIT编译器-》调用BCL->转换成机器代码运行在CPU上

  • 资源:图片,音频,视频等

GC机制

  • 垃圾回收机制(GC)代龄

GC的全称是garbage collection,中文名称垃圾回收,是.net中对内存管理的一种功能。垃圾回收器跟踪并回收托管内存中分配的对象,定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,GC会自动进行

对象代龄

CLR初始化后的第一批被创建的对象被列为0代对象。CLR会为0代对象设定一个容量限制,当创建的对象大小超过这个设定的容量上限时,GC就会开始工作,工作的范围是0代对象所处的内存区域,然后开始搜寻垃圾对象,并释放内存。当GC工作结束后,幸存的对象将被列为第1代对象而保留在第1代对象的区域内。此后新创建的对象将被列为新的一批0代对象,直到0代的内存区域再次被填满,然后会针对0代对象区域进行新一轮的垃圾收集,之后这些0代对象又会列为第1代对象,并入第1代区域内。第1代区域起初也会被设上一个容量限制值,等到第1代对象大小超过了这个限制之后,GC就会扩大战场,对第1代区域也做一次垃圾收集,之后,又一次幸存下来的对象将会提升一个代龄,成为第2代对象。

关于c#的指针问题:c#实际上有指针,只是没有去用它,也不会去用它,因为c#底层是根据c++去构建的,c#也有this。

c#创建对象注意事项:

1.创建对象是,必须要new;(内存任然在堆区)

2.访问成员时只能用点号;

3.内存是自动释放;(c++里面new完对象要delete,但是c#不用,因为GC机制)

namespace ConsoleApplication1
{
    class Program//默认访问权限是internal
    {
        //private int value; (c#里面成员变量书写格式,这里和c++不同,也就是说有多少个成员变量就要写多少个访问修饰符)
        static void Main(string[] args)//主函数入口(c#里面申明main函数必须是静态的)
        {
            //c++创建对象
            //Box box;//c#也能这样写
            //box.length=5;//但是最终编译会报错(原因是因为没有给对象开辟内存空间)
            //box->length=5;//c++里面可以可以通过->访问成员但是c#不可以,因为c#没有指针
            //C#正确写法
            Box box = new Box();//c#里面要创建对象必须要通过关键字new处理
            //GC.Collect();//也可以通过这个手动回收(相当于c++的delete)
            box->length=5;
            Box box1 = new Box(3);
            //Console.Write("宽为: {0}",box1.width);//c#输出语句格式,格式化输出一定从0开始,从1开始就会报错 
            //此时输出的结果为    宽为:3请按任意键继续. . .
            //如果此时需要输出多个,隔开就好了
            //Console.Write("宽为: {0},{1}",box1.width,box1.length);
            //此时如果是c++的话,会报错,因为box1的length没有初始化
            //此时输出的结果为    宽为:3,0请按任意键继续. . .
            //注意:c#里面所有非自定义数据类型变量默认是0
            //如果是自定义类型数据(类类型)默认为null
            //Console.WriteLine("宽为: {0},{1}",box1.width,box1.length);
            //此时输出的结果为 宽为:3,0宽为:3,0
            //              请按任意键继续. . .
            //c#也支持转义字符如\n,直接用WriteLine也会自动换行
            Console.WriteLine("宽为: " + box1.width);//c#另外一种格式化输出
            //输出结果为   宽为:3
        }
    }
    class Box
    {
        public int length;
        public int width;
        
        public Box()//显式申明了无参构造函数(默认构造函数)
        {
            
		}
        
        public Box(int width)//形参实参同名了,c++里面是不被允许的,但是c#可以
        {
            this.width = width;//也印证了c#是有指针的
        }
        ~Box()//c#里面的析构函数不需要添加访问修饰符(默认是public,不需要显式调用)
        {
            Console.WriteLine("析构函数被调用");
            //输入结果为    析构函数被调用
            //            析构函数被调用
            //同时也印证了GC回收机制,创建了2个对象,box和box1;
		}
    }
}

应用:

  • 1.实现一个动物类。要求体现封装,继承

  • 2.写一个时间类,用属性形式对私有变量的访问,并且体现有参构造和无参构造


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值