深入理解C#之个人总结系列1——C#1所搭建的核心基础

首先研究C#,并且想在C#这条路上越走越远,那先搞明白C#版本和net framework框架和vs版本,这三者的关系:

C#版本 C#1 C#2 C#3 C#4 C#5 C#6
net framework框架版本 net1.0 net2.0 net3.5 net4.0 net4.5 net4.6
VS (IDE)版本 Vs2002 Vs2005 Vs2008 Vs2010 Vs2012 Vs2015

相信大家虽然接触C#的时间也比较久了,撸C#代码也撸的比较久了,但是平时写的代码里好多都是体现C#1的特性,正所谓知其然,知其所以然,知道你撸的代码的哪部分是属于哪个版本的,那才可对其进行优化和完善。接下来,总结下C#1的几个最主要特性:

一:委托:C#1的委托使用是比较麻烦的,必须要遵循以下几个流程:

1.声明一个委托类型:

   delegate void StringProcessor(string input);

2.必须创建一个方法包含了要执行的代码:

说白了就是要封装一个和具有和委托类型相同签名的方法,例如:void PrintString(string x),返回值都是void,而输入参数都是字符串类型,所以符合委托类型的声明

3.创建委托实例:

StringProcessor pro=new StringProcessor (StaticMethods.PrintString)

4.调用委托实例

void Invoke(string input)

而委托实例其实就是一个委托列表与之关联,操作委托实例其实就是调用委托列表,而操作委托列表靠System.Detegate里的2个静态方法Combine和Remove负责

 

 

 

二:对于类型的分类

C#是面向对象的语言,而面向对象语言里的对象总归有类型的,从几个角度将C#语言分类:

1.静态语言和动态语言

到C#4.0为止,C#一直都是静态预演,除了C#4.0里用dynamic后,用的区域块是动态,但是总得来说整个语言还是静态语言

2.集合的强类型和弱类型

比如ArrayList和Hashtable属于弱类型,无法通过对象.属性来获取。而像List等是强类型,可以通过对象.属性来获取属性

3.显示类型和隐式类型

能够在声明时明确指定其类型的就是显示类型,如果无法在声明时指定其类型的就是隐式类型(需要通过编译器JIT智能推断,则用C#3里的隐式类型局部变量var来接收)

4.类型安全和类型不安全

安全:不可以将一个类型的值当作另一种完全不同类型的值,需要转换

不安全:可以将一个类型的值当作另一种完全不同的类型的值,同时不进行任何转换

 

 

三:值类型和引用类型

C#里的值类型如int struct(结构体),枚举等都是值类型,只要记住值类型是不可变的,值类型一般是在栈上,我说的是一般,而不是绝对,例如,假如一个类中一个int类型的实例变量,则在这个类的任何对象中,该变量的值和其他对象的数据一起存放在堆上,只有局部变量和方法参数在栈上,而2个相同值类型的变量之间是没有任何关系的,改变一个的值不会影响另一个,例如:

Point p1=new Point();

Point p2=p1;

而引用类型是可变的,引用类型保存在堆上,而对引用类型初始化时候需要开辟堆上空间和栈上空间,还涉及到GC管理,所以对引用对象的调用会损耗空间,性能比较低,相当于URL,2个人方法网页都是通过同一个Url去访问,修改Url里的网页内容,另一个人看到的也会实时更新

但是这里有个类型比较特殊,是string类型,他是特殊的引用类型,但是他又是不可变的

 

四:值类型和引用类型转换

值类型转换到引用类型叫作装箱

而引用类型转换到值类型就要拆箱

所以装箱和拆箱过程比较耗时,在达到数量级比较多的时候很损耗性能,不过平时小数据量范围的话性能损耗看不出来也无所谓,而C#2里的泛型正好解决了这个问题

 

posted @ 2017-09-07 14:11  叶霸天  阅读(435)  评论(0编辑  收藏  举报