C#中一些没搞明白或者容易混淆的概念以及面试中可能遇到的有关问题
以下只限于在C#中的知识,虽然与其他语言可能有点类似,但不一定意义一样。大家自觉屏蔽其他语言。
1..NET是什么?
无非包括三个方面:
编程语言(C#,Visual Basic,Visual C++)
开发工具(我们常说的VS)
框架(.NET Framework)
2..NET架构
最底层当然是操作系统
然后是公共语言运行时(我们常说的CLR-common language runtime)
再然后是.net Framework类库(FCL)
最上面才是各种语言(vb,c#,c++,f#等等)
3.CLR两个基础核心:
元数据:我们要依赖元数据进行内存管理和垃圾收集
MSIL中间语言:VS既然给我提供了多种语言都可以编写的平台,它是怎么做的呢,这就是MSIL的作用,它让.net具有跨语言的集成能力。
那些语言先编译为MSIL指令->由JIT(just in time即时编译)编译MSIL为机器语言->CLR托管执行
4.C#标识符
这里注意关键字(int,float之类的)在以@为前缀的情况下也可以作为标识符。还有就是部分允许出现数字和转义序列
其实以上这些,我们日常生活中哪里会那样定义变量,不过这个在面试的时候估计会被考到
5.C#中的var
我所知道的var一般在js中看的比较多,却也是第一次才知道c#中也存在这个弱数据类型,要注意的是,var只能用在局部变量环境下。var定义的变量一开始是不知道自己的数据类型的,只有在赋值或者在其他某种情况下,它才会后知后觉的知道自己具体是什么类型。
6.了解overload(重载)和override(重写)的区别,这边有点高深,我也有一点认识不清。大家自行查阅资料了解
7.常量
关于常量,大家第一想到的是const关键字,其实常量分为编译时常量,运行时常量。
编译时常量:const
编译时常量作为类成员总是作为static成员出现,不允许自己加static关键字。
编译时常量的值必须在编译时期能确定下来,只支持一些基本数据类型
运行时常量:readonly
运行时常量可以弥补编译时常量不能定义复杂数据类型的缺点。
8.using的三大用法
引入命名空间(using system)
通过using method = 命名空间,下面可以通过method.**来引用当中的方法
using可以指定对象生效的代码块,它会自动地释放对象。
9.枚举(enum)
每个枚举类型都有一个相应的整型类型,称为该枚举类型的基础类型(underlyingtype)。没有显式声明基础类型的枚举类型所对应的基础类型是int。枚举类型的存储格式和取值范围由其基础类型确定
enum Alignment : long { //=也可不写,默认则是以0开始,依次加1 Left = -1, Center = 0, Right = 1 } public class Test { static void Main() { //初始化一个枚举变量 Alignment alignment = Alignment.Left; //输出:Left Console.WriteLine(alignment); //输出:-1 Console.WriteLine((long)alignment); //获得基础类型 Type underlyingType = Enum.GetUnderlyingType(typeof(Alignment)); //输出:System.Int64 //解释:[long关键字映射的类型为System.Int64] Console.WriteLine(underlyingType.FullName); } }
10.开头大写的String和开头小写的string的区别
String是.net类库中的对象,这个方法比较多
string是C#关键字,这个方法相对较少
两者基本上是可以互用的,但还是要视具体情况。
11.委托(这个比较难懂)
这个最大的好处就是可以将方法作为实体赋值给变量和作为参数传递。相当于c中的指针吧,不过委托是面向对象的,但不可继承。
class Test { //声明一个委托 delegate double Function(double x); static void Main() { //创建一个委托对象 Function weituo = new Function(Square); //利用f携带的“Square”方法,所以可以用f进行间接调用Square //也可以写weituo(5),这是对weituo.Invoke(5)的语法简化 double result = weituo.Invoke(5); System.Console.WriteLine(result);//25 } static double Square(double x) { return x * x; } }