.NET理论知识 笔试准备 Day3

一、Base64编码

在项目中常用到Base64编码,有些是传值到后端,有些是对接API要求,一直以为Base64是像MD5一样的加密方式(因为编码后像乱码一样)。。。

原来,Base64是把0~63用A~Z,a~z,0~9以及+、/共64个个字符来表示

把字符长度除以3,不足的补0,注意这里的“0”不是Base64对应的“A”,而是“=”,所以经常我们看到ed2k之类的下载地址后面有一两个=

要求被编码字符是 8bit 的,所以须在 ASCII 编码范围内,u0000-u00ff,中文就不行

不过各种语言一般都可以先把中文编码再用Base64,下面这是C#版的

//编码
string ssd = Convert.ToBase64String(System.Text.Encoding.GetEncoding("gb2312").GetBytes("中国"));
//解码
string ss = System.Text.Encoding.GetEncoding("gb2312").GetString(Convert.FromBase64String(ssd));

js也有相应的Base64插件,去搜一下很多。直接引用就可以进行Base64进行编解码了,还支持中文

二、条形码

今天项目中有用到条形码,有分CODE128A、B、C,每种格式不大一样,网上有JsBarCode、Code128之类的插件,直接调用就可以,使用HTML5的CANVAS来绘制条形码

<img class="BarCode" title="123456789" />

三、属性/索引器

索引器从来没用过。。。但看笔试题里常有拿来和属性比较,就摘录一下吧

属性可以调用方法就如同他们是公共数据成员,而索引器可以调用对象上得方法,如同对象是一个数组。
属性可以通过简单的名称访问, 而索引器需要通过索引器访问。
属性可以为静态成员或者实例成员,而索引器必须是实例成员。
属性的get访问器没有参数, 而索引器上的get访问器具有与索引器相同的形参表。
属性的set访问器包含隐式value参数,而对于索引器,除了value参数外,索引器的set访问器还具有与索引器相同的形参表。
类的每一个属性都必须拥有唯一的名称,而类里定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器重载)。 
属性可以是static(静态的)而索引器则必须是实例成员。
属性名可自定义,索引器必须以this命名。
属性可以为实例或静态,索引器必须是实例的。
索引器有索引参数列表,而属性没有

四、Const/Readonly

项目中也没注意,反正是只读,甚至都没用只读,类都不大,取个好名字,谁会去乱改。。。

const 关键字用于修改字段或局部变量的声明。它指定字段或局部变量的值不能被修改。常数声明引入给定类型的一个或多个常数。
const数据成员的声明式必须包含初值,且初值必须是一个常量表达式。因为它是在编译时就需要完全评估。
const成员可以使用另一个const成员来初始化,前提是两者之间没有循环依赖。

readonly在运行期评估赋值,使我们得以在确保“只读访问”的前提下,把object的初始化动作推迟到运行期进行。
readonly 关键字与 const 关键字不同: const 字段只能在该字段的声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。另外,const 字段是编译时常数,而 readonly 字段可用于运行时常数。
readonly 只能在声明时或者构造函数里面初始化,并且不能在 static 修饰的构造函数里面。
const修饰的常量在声明的时候必须初始化;readonly修饰的常量则可以延迟到构造函数初始化 
const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值;readonly修饰的常量则延迟到运行的时候
const常量既可以声明在类中也可以在函数体内,但是static readonly常量只能声明在类中。
    static readonly int A=B*10;
    static readonly int B=10;   
    public static void Main(string[] args){
        Console.WriteLine("A is {0},B is {1} ",A,B); //A is 0, B is 10
    }
    const int A=B*10;
    const int B=10;   
    public static void Main(string[] args){
        Console.WriteLine("A is {0},B is {1} ",A,B); //A is 100, B is 10
    }
const是静态常量,所以在编译的时候就将A与B的值确定下来了(即B变量时10,而A=B*10=10*10=100),那么Main函数中的输出当然是A is 100,B is 10啦。而static readonly则是动态常量,变量的值在编译期间不予以解析,所以开始都是默认值,像A与B都是int类型,故都是0。而在程序执行到A=B*10;所以A=0*10=0,程序接着执行到B=10这句时候,才会真正的B的初值10赋给B。
由于const常量在编译时将被替换为字面量,使得其取值类型受到了一定限制。const常量只能被赋予数字(整数、浮点数)、字符串以及枚举类型。
readonly以引用方式进行工作,某个常量更新后,所有引用该常量的地方均能得到更新后的值。

取值永久不变(比如圆周率)使用const,一般使用readonly

五、CLR/JIT/IL

CLR,.NET提供了一个运行时环境,叫做公用语言运行时(Common Language Runtime),是一种多语言执行环境,支持众多的数据类型和语言特性。他管理着代码的执行,并使开发过程变得更加简单。这是一种可操控的执行环境,其功能通过编译器与其他工具共同展现。
 
它的主要功能是负责将代码转换成为机器代码,简单的说就是在不同的平台上安装了它,就能运行同样的程序,并且程序不用修改。
 
而不同的程序在.NET环境下编译完毕之后,都变成了IL,也就是.NET框架中中间语言(Intermediate Language)的缩写 使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的程序代码并不是CPU能直接执行的机器代码,而是一种中间语言IL(Intermedate Language)的代码。
 
IL的特征是低级语言、语法简单(数字代码),能快速转变成机器代码,所以具备平台无关性的基础。
 
而程序被编译之后,就只是变成了IL,当需要运行时,在CLR的基础上,才变为机器代码,在不同的平台上运行。

CLR像java的虚拟机,一个功能是JIT编译,把程序编译成IL,IL再转成底层代码。另一功能是GC垃圾回收

六、进程/线程

一个程序至少有一个进程,一个进程至少有一个线程. 
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响
线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉
原文地址:https://www.cnblogs.com/liuyouying/p/5071849.html