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#知识点记录的主要内容,如果未能解决你的问题,请参考以下文章

c#代码片段快速构建代码

此 Canon SDK C++ 代码片段的等效 C# 代码是啥?

是否可以动态编译和执行 C# 代码片段?

C#常用代码片段备忘

优化 C# 代码片段、ObservableCollection 和 AddRange

VS2015使用技巧 打开代码片段C#部分