前言
这是学习C#第五天了,感觉在网上找资料看始终是没有那种全面的感觉,于是买一本C#图解教程,来进行查漏补缺…
一、C#编译时和运行时的过程
如图所示,这里面出现了几个概念
- 程序集
- JIT编译器
- CLR
1,程序集
首先程序集是由.NET
语言的编译器接受源代码文件,生成名为程序集的输出文件
- 程序集要么是可执行的,要么是DLL(
DLL
:动态链接库,是许多函数的集合) - 程序集里面的代码不是本机代码
就是可以直接被计算机识别的代码
, 而是一种名称为CIL的中间语言
- CILCommon Intermediate Language
公共中间语言
程序集包含的信息中,包括下列项目
- 程序的CIL
- 程序中使用的类型的元数据
- 对其他程序集引用的元数据
2,JIT编译器
这里注意:程序的CIL直到被调用运行时才会被编译成本机代码
JIT是在CLR公共语言运行库中的,JIT在编译之前,CLR会有以下步骤
- 检查程序集的安全特性
- 分配内存
- 可执行的代码被编译器编译为本机代码,这里需要注意:在前面说过,程序集中并不都是可执行代码,还有DLL等
3,CLR
.NET
框架的核心组件是CLR
,它在操作系统的顶层,负责管理程序的执行,除此之外还提供一些其他的功能
- 自动垃圾收集
- 安全和认证
- 通过访问BCL得到广泛的编程功能
-BCL
基础类库 - 反射服务
- 内存管理
- JIT编译器
- 类加载器
- 安全服务
二、C#基础语法查漏补缺
1,多重标记和值
在C#,可以使用任意数量的替代标记和任意数量的的值
- 值可以以任何顺序调用
- 值可以在格式字符串中替换任意次
Console.WriteLine("Three integers are {1}, {0} and {1}", 4 ,5 );
2,对齐说明符
对齐说明符表示字段中字符的最小宽度,对齐说明符有以下特性
- 对齐说明符是可选的,并且使用逗号啦和索引号分离
- 它由一个正整数或负整数组成
- 整数表示字段使用字符的最少数量
- 符号表示右对齐或者左对齐,正数右对齐,负数左对齐
Console.WriteLine("{0,10}",200);
注意:值的实际表示可能会比对齐说明符指定的字符数多一些或少一些
- 如果要表示的字符数比对齐说明符中的指定字符数少,那么其余字符会使用空格填充
- 如果要表示的字符数多余指定的字符数,对齐说明符会被忽略,并且使用所需的字符进行表示
3,值类型和引用类型
这两种类型的对象在内存中的存储方式不同:
- 值类型只需要一段单独的内存,用于存储实际的数据
- 引用类型需要两段内存
-
第一段存储实际的数据,总是位于堆中
-
第二段是一个引用,指向数据在堆中的存放位置
-
引用类型作为值参数和引用参数
对于一个引用类型对象,不管是将其作为值参数传递,还是引用参数传递都可以在方法成员内部修改它的成员。
不过我们并没有在方法内部设置形参本身,我们来在方法内设置引用类型形参时会发生什么
- 将引用类型对象作为值参数传递,如果在方法内创建一个新对象并赋值给形参,将切断形参与实参之间的关联,并且在方法调用结束后,新对象也将不复存在
- 将引用类型对象作为引用参数传递 ,如果在方法内创建一个新对象并赋值给形参,在方法结束后该对象仍然存在,并且是实参所引用的值
class MyClass
{
public int Val = 20;
}
class Program
{
static void RefAsParameter(MyClass f1)
{
f1.Val = 50;
Console.WriteLine($"After member assignment:{f1.Val}");
f1 = new MyClass();
Console.WriteLine($"After new Object creation:{f1.Val}");
}
static void Main(string[] args)
{
MyClass a1 = new MyClass();
Console.WriteLine($"Before method call:{a1.Val}");
RefAsParameter(a1);
Console.WriteLine($"After method call: { a1.Val}");
}
}
未完待续…