C#知识点记录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#知识点记录相关的知识,希望对你有一定的参考价值。
用于记录C#知识要点。
参考:CLR via C#、MSDN、
记录方式:读每本书,先看一遍,然后第二遍的时候,写笔记。
CLR:公共语言运行时(Common Language Runtime)是一个可由多种编程语言(VB、F#等)使用的公共语言运行库。
托管模块:编译源码会生成托管模块,他是标准的PE文件。包含:PE32头、CLR头、IL中间语言。
元数据:CLR除了生成IL外,还会生成元数据。元数据总与包含IL代码的文件相关联。
程序集:是一个或多个模块/资源的逻辑性分组。是重用、安全性、版本控制的最小单元。程序集可以是DLL或者可执行程序。
FCL:Framework类库(Framework Class Library)一组DLL程序集的统称。
CTS:通用类型系统,制定的一个正式规范描述类型定义和行为的系统。
CLS:公共语言规范,详细定义了一个最小功能集。只有支持这个功能集,生成的类型才能兼容其他组件。
OOP:面向对象编程(Object-Oriented Programming)软件的一种设计模式,基于封装、继承、多态这三个概念进行开发。
CSP:组件软件编程(Component Software Programming)OOP发展到极致的产物,讲代码形成组件模块。
两种程序集
CLR支持两种程序集:弱命名程序集 和 强命名程序集。
他们结构完全相同,均包含PE文件、PE32头、CLR头、元数据、清单表、IL。
区别在于强命名程序集使用发布者的公钥/私钥进行了非对称加密签名。可以部署到任何地方。
两种部署
程序集可以采用两种方法进行部署:私有或全局。
私有部署指应用程序目录或某个子目录。弱命名程序集只能私有方式进行部署。
全局部署指部署到一些公认位置的程序集。CLR在查找程序集时,会检查这些位置。
CLR要求每个类型最终都从 System.Object 类型派生。所以每个类型都会有基本方法。
类型安全:CLR最重要的特性之一,运行时CLR总能知道对象的类型是什么。调用GetType即可知道对象的确切类型。
类型转换
隐式转换与显式转换。如派生类转换为基类,称为隐式转换,不需要操作。
//隐式转换 Object o = new Int32(); //显式转换 Int32 i = (Int32)o;
is 和 as 操作符转换。
is 判断是否可以转换。可以返回 true。
as 是is的简化写法。会判断是否可以转换,如果不可以返回null,可以则返回转换后的结果。
基元类型:编译器直接支持的数据类型称为基元类型,编译器会自动映射到对应对象。例如string 会映射到 System.String
checked 和 unchecked 基元操作
对基元类型进行算术运算操作,可以造成溢出。编译器默认不会检查溢出,checked操作符进行检查。unchecked操作符不进行检查。
checked { Byte b = 100; b = (Byte)(b + 300); }
uint i = unchecked((UInt16)(-1));
CLR支持两种类型:引用类型和值类型。
引用类型:从托管堆分配,new操作符返回对象内存地址。每次初始化都会进行内存分配,所以效率会变慢。
值类型:一般在线程栈上,不包含指向指针。不受GC控制,缓解了托管堆的压力。
任何称为类的类型,都是引用类型。值类型都称为结构或枚举。
值类型比引用类型轻的原因是,不用分配内存,不被GC,不会通过指针引用。
装箱:值类型转换成引用类型,称为装箱。分别进行三步:1.分配内存。2.赋值字段到堆中。3.返回对象地址。
拆箱:引用类型转换值类型,称为拆箱。分别进行两步:1.获取已装箱的地址。2.将字段包含的值从堆复制到栈的实例中。
拆箱效率比装箱低得多。
哈希码:Object提供GetHashCode可以获得任何对象的哈希码。
dynamic基元类型:表示对象的操作将在运行的时候解析。可以绕过类型安全监测。
static void Main(string[] args) { dynamic value; for (int demo = 0; demo < 2; demo++) { value = (demo == 0) ? (dynamic)5 : (dynamic)"A"; M(value); } Console.ReadLine(); } private static void M(int n) { Console.WriteLine("Int类型{0}", n); } private static void M(string s) { Console.WriteLine("String类型{0}",s); }
成员的可访问性
private 只能由定义类型或嵌套类型的方法访问。
protected 只能由定义类型、嵌套类型、派生类型中访问。
internal 只能由定义程序集中的方法访问
protected internal 任何嵌套、派生、程序集中的方法访问。
public 可以由任何程序集访问。
静态类:static 定义不可实例化的类。不能应用于结构。
静态类不能创建实例、不能实现任何接口、只能定义静态成员、不能作为字段,方法参数或局部变量使用。
静态类从程序启动时就会一直占用内存。只有确定不需要实例化、继承等特性的时候,才使用静态类。
分部类:partial可以将代码分散到一个或多个源代码中。
分部类的优点:源代码控制方便,在同一个类中分解成不同的逻辑单元,代码拆分。
组件版本控制关键字
abstract 抽象方法,指派生类型必须重写并实现这个成员。
virtual 虚方法,指已定义实现,可由派生类型重写。
override 实现抽象,表示正在重写类型的成员。
sealed 密封类,不能被派生重写。
new 表示该成员与基类中相似的成员无关系。public new void ToString()
以上是关于C#知识点记录的主要内容,如果未能解决你的问题,请参考以下文章
此 Canon SDK C++ 代码片段的等效 C# 代码是啥?