目录
-
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.写一个时间类,用属性形式对私有变量的访问,并且体现有参构造和无参构造
本文是C#学习笔记的第一部分,主要介绍了C#的访问权限,包括public、protected、private和internal等,讲解了程序集的构成如元数据、IL代码和资源,以及垃圾回收(GC)机制,特别是对象代龄的概念。同时,讨论了C#中指针的存在以及创建对象的注意事项,包括new关键字的使用和自动内存管理。



3万+

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



