CSharp Language Specification

CSharp Language Specification

一、基础

1.规范:

除常量外,所有变量用驼峰命名方式,其它用帕斯卡命名方式.

2.编译:

首先由csc.exe将cs文件编译成MSIL.当双击exe的时候,会由clr的jit(just in time)编译器再次编译成cpu指令.

csc位置(如):C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe

csc命令(如):csc /t:library acme.cs(编译成类库) csc /r:acme.dll test.cs(引用acme.dll后编译)

ngen位置(如):C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe(可实现jit效果)

ngen命令(如):ngen install D:\SystemTool\HelloWorld.exe  (备注:exe方式)

3.面向对象(Object-Oriented 面向对象编程:Object-Oriented-Programming):

类是抽象的,对象是具体的.

析构函数:~ClassName(){}.实际是重写基类的Finalize()方法

4.变量:

成员变量:默认有一个初始值.string->null,int->0,bool->false

局部变量:使用前必须赋值.

5.封装:

a.字段封装成属性 b.方法参数封装成类 c.方法重用 d.封装成类库

6.继承:

单根性,传递性

构造函数不继承.

7.多态:

a.vitual和override方法可以给重写

b.abstract方法

c.接口

8.访问修饰符:

成员访问修饰符:
private:当前类内

protected:当前类内和子类内

internal:当前程序集内

protected internal:当前程序集内或当前类内和子类内

public:所有都可以

命名空间下的访问修饰符:

只允许使用public和internal,但是微软内部使用private.

9.静态:

静态作为与多态区别的.stati修饰.

静态类:不能被实例化,成员都为静态成员,可以有const常量

静态成员:静态成员在赋初始值的时候,是在静态构造函数中赋值的.

静态构造函数:在类第一次使用前只调用一次.不能有修饰符,不能重载.

10.值类型与引用类型 值传递与引用传递:

值类型:int double struct等隐式继承ValueType.

引用类型:string 类 数组等隐式继承Object.

值传递:默认就是值传递.

引用传递:在方法参数中加上ref就是引用传递.

11.SOLID:

single:单一职责

open:开发封闭

lis:里氏替换

interface:接口分离

depend:依赖倒置

面向对象设计的SOLID原则

12.接口:

a.接口里只能定义方法.

b.接口的成员不能有修饰符.默认为public

13.实现接口和显示实现接口:

一个类同时实现接口和显示实现接口。

显示实现接口:当被调用的是接口的时候,则调用显示接口的方法

实现接口:默认执行实现接口的方法.

14.类型转换:

隐式转换:当小范围的类型转大范围的类型.

强制转换:当指定的大范围的类型对象可以转小范围类型的时候用(类型名)或者as进行转换

convert:语义转换

parse:将其他类型转换成数字类型

15.单位:

1byte = 8bit

1kb = 1024byte

Int32 = int : 4byte

16.异常处理:

错误类型:语法错误/逻辑错误/运行错误

throw; :在catch中执行就是将异常继续往上抛

在try-catch-finally中,注意return的问题.本质都是编译把return拿到最下面.通过反编译工具可以看到return的值会单独拿个变量接受

17.参数修饰符:

params:可变参数

out:传出参数

ref:引用传递,本质在传参数的值的时候,传递的是该变量的内存地址

18.字符串:

1.字符串不可变性:实际双引号里的字符串 都是常量.普通声明的常量,是声明一个常量的变量接受一个常量.

2.字符串拘留池:正是因为字符串的不可变性,所以提出了这个池的技术,实际就是把字符串的内容当做键,字符串的地址当做值.

3.StringBuilder:在字符串拼接时,一定要使用该对象.否则将不断创建string对象.并且非常建议给定初始值.

C# 字符串拘留池机制

19.垃圾回收 GC:

回收对象:托管资源内存中的堆对象.

回收时间:不确定

垃圾回收分3代.当第一代空间满的时候,就回收第一代资源,并把没有回收的对象移到第二代中.依次类推.非常不建议手动垃圾回收.

20.集合:

集合和数组 表面上一个是不定长度 一个固定长度. 实际本质集合的内部维护着一个数组.当增加一个元素的时候,会重新一个new一个数组

常见集合:

ArrayList        List<T>

Hashtable       Dictionary<T,T>                                                           

Stack         Stack<T>LIFO

Queue        Queue<T>

微软建议使用泛型类的集合.本质原因也是因为减少装箱拆箱的次数.

21.装箱拆箱

装箱拆箱发生在发生在父子类之间的.

装箱:值类型转成引用类型.常转成Object,值类型实现的接口.

拆箱:引用类型转成值类型.常在强制转换成值类型中出现

22.Path File Directory FileInfo DirectoryInfo Stream StreamWriter StreamReader

路径 文件 目录 文件信息 目录信息 流 写入流 读入流

以流的形式 会减轻设备的压力.不会出现一下子全读完才执行后续操作.

23.编码

ASCII  GB2312  GBK  UNICODE  UTF-8

Encoding.GetEncodings()取计算机所有编码

实际字符串存储在计算机上都是数字,以byte[]的方式存储.

乱码的原因就是存的编码和读的编码不一致导致的

24.序列化

序列化步骤:创建序列化器,序列化或者反序列化.

xml序列化: XmlSerializer 类 (System.Xml.Serialization)

js序列化:JavaScriptSerializer 类 (System.Web.Script.Serialization)

二进制序列化:BinaryFormatter类(System.Runtime.Serialization.Formatters.Binary)

序列化:将对象状态保存到存储设备.

25.委托/事件

委托本质就是一个类型

事件是委托的对象,本质是一个私有的委托对象和2个public的方法.所以事件只有类内部能调用!

26.匿名

匿名方法:delegate(参数){方法体} 多用于委托对象赋值,本质是编译器起了一个名字.

Lambda:语句:(参数)=>{方法体} 表达式(只有一个参数,方法体只有一句话的时候)例如:x=>x+2;

匿名类型例:new {Code = ViewBag.Code};匿名类型的属性是只读的!本质匿名类型的字段都是私有的readonly,封装成只读的属性.

27.泛型

泛型支持:类 方法 委托 接口

泛型约束:where T: class struct new() 类名 接口名

28.扩展方法

扩展方法:静态类 静态方法 第一个参数类型就是要扩展的类型

本质是编译器把扩展的类型作为参数传到静态方法中.

29.程序集

.net生成的exe和dll都是程序集.

包括类型元数据,程序集元数据,资源文件,MSIL中间语言.

公共的Assembly在GAC中,所以编译的时候,默认导入的程序集不会输出.

30.Type Assembly

描述类的类型.通过Type对象,可以实例化出这个Type所指的类型的对象.

Type:通过Typeof(类名),GetType(对象名)

Assembly:Assembly.LoadFrom(程序集名)返回一个Assembly对象.GetType(类的限定名)获得指定的类的Type对象.

根据Type创建对象:Activator.CreateInstance(Type对象名)

31.XML

可扩展标记语言:区分大小写,一个根节点,属性值双引号,CDATA区,注释和html一样,文档申明的编码和实际编码要一致.

32.深拷贝 浅拷贝

深拷贝是所有成员都在内存中拷贝一份.通过序列化可以完成深拷贝.

浅拷贝:除了深拷贝,都是浅拷贝,MemberwiseClone()可以直接拷贝.

时间: 2024-10-10 20:15:46

CSharp Language Specification的相关文章

java language specification官方地址

背景: 刚才在看volatile修饰符的时候看到作者都是在阅读了java language specification后翻译为自己的理解讲述出来的 调查: java language specification即java语言规范,是一切java编程的基础参照文档. 官方文档(Java Language and Virtual Machine Specifications): http://docs.oracle.com/javase/specs/ 也就是说如果想要真正掌握java语言的核心精确含

如何从oracle官网中下载The java language specification(java 语言规范)

第一步: 第二步: 第三步:下面这个图在这个页面的下方,所以你只要一直往下看,直到看到下图的文字为止: 第四步: 第五步: 这样你就可以成功下载该java 语言规范的pdf了. 它直接下载的网址为: http://docs.oracle.com/javase/specs/index.html

使用 IL 实现类型转换

在之前的文章中,我大致介绍过一些类型间的隐式和显式类型转换规则.但当时并未很仔细的研究过<CSharp Language Specification>,因此实现并不完整.而且只部分解决了类型间能否进行类型转换,仍未解决到底该如何进行类型转换,尤其是在定义泛型类型时,我们明明知道泛型类型的参数是什么类型,但就是不能直接进行类型转换: if (typeof(T) == typeof(int)) { int intValue = (int)value; // 错误:无法将类型“T”转换为“int”

C#各版本新特性

转 C# 2.0 泛型(Generics) 泛型是CLR 2.0中引入的最重要的新特性,使得可以在类.方法中对使用的类型进行参数化. 例如,这里定义了一个泛型类: class MyCollection<T> { T variable1; private void Add(T param){ } } 使用的时候:MyCollection<string> list2 = new MyCollection<string>(); MyCollection<Object&g

C#各版本新特性(转)

C# 2.0 泛型(Generics) 泛型是CLR 2.0中引入的最重要的新特性,使得可以在类.方法中对使用的类型进行参数化. 例如,这里定义了一个泛型类: class MyCollection<T> { T variable1; private void Add(T param){ } } 使用的时候:MyCollection<string> list2 = new MyCollection<string>(); MyCollection<Object>

C#格式规范

前言 之前工作中整理的一篇编码规范. 代码注释 注释约定 只在需要的地方加注释,不要为显而易见的代码加注释使用 /// 生成的xml标签格式的文档注释 方法注释 所有的方法都应该以描述这段代码的功能的一段简明注释开始(方法是干什么).这种描述不应该包括执行过程细节(它是怎么做的) /// <summary> /// 把对象类型转化为指定类型 /// </summary> /// <typeparam name="T">动态类型 </typepa

Java Language Programming Design (One)

Chapter One.              Introduction to JAVA (1)Preliminary Knowledge a)Java Language Specification b)Java API c)Java Edition: Java SE,Java EE,Java ME d)Java Environment:  JDK,JRE,JVM e)Java Development Tools:eclipse,MyEclipse,NetBeans... Note:You

JVMS Specification(2)-Compiling for the Java Virtual Machine

Subsections 2       Compiling for the Java Virtual Machine 2.1        Format of Examples 2.2        Use of Constants, Local Variables, and Control Constructs 2.3        Arithmetic 2.4        Accessing the Runtime Constant Pool 2.5        More Control

JVMS Specification(3)-The class File Format

Subsections 3 The class File Format 3.1 The ClassFile Structure 3.2 The Internal Form of Names 3.2.1 Binary Class and Interface Names 3.2.2 Unqualified Names 3.3 Descriptors and Signatures 3.3.1 Grammar Notation 3.3.2 Field Descriptors 3.3.3 Method D