一,.NET平台的重要组成部分都是有哪些
1)FCL(所谓的.NET框架类库)
这些类是微软事先定义好的。
例如当我们新创建一个windows窗体应用程序是,VS会帮我们自动生成下面的代码:
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;这些就是微软事先为程序员定义好的类库。程序员可以直接使用的。
2)CLR(所谓的公共语言运行时)
创建部署.NET程序的必备环境
使用C#,F#,VB等语言都可以来创建.NET应用程序。这时候就需要一个公共语言规范,来把不同的语言解释成.NETFramWork认识的东西。
二,什么是程序集
程序集主要有MSIL组成(所谓的微软中间语言,主要由dll文件组成)
不同编程语言程序被.NETFrameWork编译成程序集(dll文件),当程序需要被执行时,通过CLR中的JIT(及时编译器)编译成本地代码,并将指令发送给CPU执行。
程序集一般有两种:.dll和.exe文件(但是不是所有的dll和exe都叫程序集)
比如:我们在同一个解决方案下,建立多个应用程序或者类库文件。这些程序或者类库编译后就会变成不同的程序集。他们之间是相互独立的。之间如果想要相互访问,需要添加引用。
三,Parse转换和Convert转换的区别
1)Parse转换
①Parse转换只能转换字符串
②自变量是指定的数据类型才可以转换成功
下面的是.NETReflector编译的源代码
2)Convert转换
①可以转换其他类型(如:类)
②与Parse的区别就是,转换前会对被转换的对象进行判断,如果对象为null则会转换失败
下面是实例源代码:
classProgram{staticvoidMain(string[]args){stringa=Console.ReadLine();//Parse只可以转换字符串intb=Int32.Parse(a);//Convert可以转换类等对象ParseNumberparNum=newParseNumber();//这种写法编译器会报错//intb=Int32.Parse(parNum);intc=Convert.ToInt32(parNum);Console.WriteLine(b);Console.WriteLine(b.GetType());Console.ReadKey();}}classParseNumber{privateintnunm;publicintNum{get;set;}}
四,数据类型的存储位置
1)存储在栈中的数据类型
所有数值类型,char,bool,枚举,结构体
2)存储在堆中
string,数组,类
下面以数组来简单说一下这个问题:
①首先程序会在栈中开辟一段名为arr的int[]类型的空间
②然后在堆中开辟一个int[]对象,再该对象中会有4块连续的内存空间
③堆中的对象返回类型为地址,即newint[4]表达式返回的是地址
示意图如下:
五,C#方法调用
1)在C#中我们可以给参数传递默认值,所以当我们调用这个方法的时候,可以不给这个参数传递值
下面的写法编译器会报错
3)方法的可变参数
①可变参数被Params
②Params只能用来修饰一维数组
4)方法的out和ref参数
①out参数侧重于输出,必须在方法内对其赋值
正确的使用方法
六,属性易混淆点辨别
①属性本身不存值,值是存在这个属性所封装的字段里面
classStudy{privateintnID;//属性的值存储在封装的字段里面publicintNID{get{returnnID;}//这里我们给属性赋值set{nID=value;}}}通过访问属性字段获取字段的值
Studystu=newStudy();//通过访问属性字段获取字段的值intnID=stu.NID;②属性的返回值类型和字段的值类型没有关系
//属性的值类型为boolprivateboolgender;//字段的返回类型为stringpublicstringGender{get{returngender==true"男":"女";}set{gender=value=="男"true:false;}}属性的返回值类型决定了get返回值的类型和set参数的类型
//属性的值类型为boolprivateboolgender;//字段的返回类型为stringpublicstringGender{//get的返回值类型为boolget{returngender==true"男":"女";}//set参数类型为boolset{gender=value=="男"true:false;}}③自动属性到底是怎么回事?
看如下的代码:
privatestringstrName;//自动属性封装strNamepublicstringStrName{get;set;}这就是所谓的自动属性封装字段。在非自动属性中,程序默认的会有value值来给字段赋值,但是在自动属性中是怎么赋值的呢?
我们使用.NETReflector反编译来看源代码:
这是我们封转的属性代码:
反编译set函数源代码:
我们可以看到.NET会默认为我们的程序生成一个成员变量
get函数的源代码:
返回的也是该成员变量;
那么什么时候可以使用自动属性呢?
如果对一个字段取值和赋值的时候没有任何逻辑验证并且可读可写的时候,就可以使用自动属性。
①首先给大家说明一个问题就是,文件名和类名必须是一样的么(就是我们在创建类的时候要命明,这个时候会默认的生成一样的类名称)?
如图所示
这个是必须的么?
我们尝试修改类名称为ChildName,然后访问类
可以看到我们要访问类,需要通过类名称访问而与文件名没有关系。
②类表达式的执行顺序和其意义
Studystu=newStudy();编译器执行代码的时候,
首先会先在栈中开辟一块类型为Study的内存空间放置变量stu
然后在堆中创建该变量的对象
然后调用该对象的构造函数,并且返回该对象在堆中的地址。