.Net knowledge Note I

来源:互联网 发布:中小企业网络构建 编辑:程序博客网 时间:2024/04/29 00:26

★什么是强类型,什么是弱类型?哪种更好些?

   强/弱类型是指类型检查的严格程度的。语言有无类型,弱类型和强类型三种。无类型的不检查,甚至不区分指令和数据。弱类型的检查很弱,仅能严格的区分指令和数据。强类型的则严格的在编译期进行检查。

   使用哪种语言还是要按需而定。编写简单小应用,使用弱类型语言可节省很多代码量,有更高的开发效率。而对于构建大型项目,使用强类型语言可能会比使用弱类型更加规范可靠。

------------------------

★全局程序集缓存GAC:概念

GAC全称是Global   Assembly   Cache,他的作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data、System.Windows.Forms等等。这样,很多程序就可以从GAC里面取得Assembly,而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。这样取用方便,也有利于Assembly的升级和版本控制。

 

------------------------

★ PID:概念 

      PID(进程控制符)英文全称为Process Identifier,它也属于电工电子类技术术语。

  PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID。进程中止后PID被系统回收,可能会被继续分配给新运行的程序。

  PID一列代表了各进程的进程ID,也就是说,PID就是各进程的身份标识。

------------------------

C# 对象深拷贝、浅铐贝、直接拷贝

C#中有两种类型变量,一种是值类型变量,一种是引用类型变量。对于前者,copy是属于全盘复制;而对于后者,一般的copy只是浅copy,相当于只传递一个引用指针一样。因此对于后者进行真正copy的时候,也是最费事的,具体的说,必须为其实现ICloneable接口中提供的Clone方法。

  浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用.
  深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.

 

浅拷贝和深拷贝之间的区别:浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化

深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一个新的和原是对象中对应字段相同(内容相同)的字段,也就是说这个引用和原是对象的引用是不同的,我们在改变新对象中的这个字段的时候是不会影响到原始对象中对应字段的内容。所以对于原型模式也有不同的两种处理方法:对象的浅拷贝和深拷贝。

浅拷贝:

    MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。

深拷贝:

   即实现ICloneable接口.ICloneable可用于深拷贝和浅拷贝。

 

在实际中一般都是采用序列化A,然后将序列化的结果反序列化得到B来实现深层拷贝的目的。

------------------------

★命名空间与装配件的关系
Assembly是一个程序集相关的静态类,保存了程序集的信息   //此叙述不一定正确
Assembly的主要用处是:
ⅰ与反射Reflection结合起来用,动态创建你所需要的类!!
ⅱ与反射Reflection结合起来用,获得Assemble里类的信息
(据可靠的小道消息说Assembly里存的是一张包含元数据类名什么的表)
ⅲ使用别人已封装好的类.
     装配件是.Net应用程序执行的最小单位,编译出来的.dll、.exe都是装配件。
     装配件和命名空间的关系不是一一对应,也不互相包含,一个装配件里面可以有多个命名空间,一个命名空间也可以在多个装配件中存在.

     Type.GetType属于Reflection的一部分,Reflection可以用于动态解析类型。也就是说,即使编译开发期间没有建立对Assembly的引用,Type.GetType一样可以用于取得类型信息(相反,typeof是静态解析类型的,所以要求reference)。
     Type.GetType:  单从类型的名称(包括Namespace部分)是不可能找到类型定义的,还必须知道定义类型的Assembly的名称和位置。所以在调用Type.GetType的时候必须要附带指明Assembly的信息。

如何使用反射获取类型
如何获得类型信息:
     获得类型信息有两种方法,一种是得到实例对象
     这个时侯我仅仅是得到这个实例对象,得到的方式也许是一个object的引用,也许是一个接口的引用,但是我并不知道它的确切类型,我需要了解,那么

就可以通过调用System.Object上声明的方法GetType来获取实例对象的类型对象,比如在某个方法内,我需要判断传递进来的参数是否实现了某个接口,如果

实现了,则调用该接口的一个方法:

public   void   Process(   object   processObj   )
{
Type   t   =   processsObj.GetType();
if(   t.GetInterface(“ITest”)   !=null   )
                    …
}

        另外一种获取类型的方法是通过Type.GetType以及Assembly.GetType方法,如:
              Type   t   =   Type.GetType(“System.String”);
        需要注意的是,前面我们讲到了命名空间和装配件的关系,要查找一个类,必须指定它所在的装配件,或者在已经获得的Assembly实例上面调用

GetType。
        本装配件中类型可以只写类型名称,另一个例外是mscorlib.dll,这个装配件中声明的类型也可以省略装配件名称(.Net装配件编译的时候,默认都

引用了mscorlib.dll,除非在编译的时候明确指定不引用它),比如:
          System.String是在mscorlib.dll中声明的,上面的Type   t   =   Type.GetType(“System.String”)是正确的
          System.Data.DataTable是在System.Data.dll中声明的,那么:
Type.GetType(“System.Data.DataTable”)就只能得到空引用。
          必须:
Type   t   =   Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0,   Culture=neutral,   PublicKeyToken=b77a5c561934e089");

------------------------

------------------------

原创粉丝点击