名词解释

 
【CLR:】
donet是由CLR和.net框架类库组成的。CLR事实上可以看作是跟java虚拟机相同概念的。所有运行其上的语言不管是vb,c#,c++都跟它发生运行其上。之所以叫虚拟机,是因为在它上面运行的代码是于其他进程隔离的,代码处在一个封闭,受控的环境。

【CLS:】
公共语言规范的英文缩写。只要附和这个语言规范,产生的代码就可以运祥在.net的虚拟机上,也就是clr。

【IL:】
中间语言或MSIL。

托管代码是可以使用多种支持Microsoft .NET Framework的高级语言编写的代码,它们包括:C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的语言共享统一的类库集合,并能被编码成为中间语言(IL)。运行库编译器(runtime-aware ompiler)在托管执行环境下编译中间语言(IL)使之成为本地可执行的代码,并使用数组边界和索引检查,异常处理,垃圾回收等手段确保类型的安全。

在托管执行环境中使用托管代码及其编译,可以避免许多典型的导致安全黑洞和不稳定程序的编程错误。同样,许多不可靠的设计也自动的被增强了安全性,例如 类型安全检查,内存管理和释放无效对象。程序员可以花更多的精力关注程序的应用逻辑设计并可以减少代码的编写量。这就意味着更短的开发时间和更健壮的程序。

【[C#/IL码/CLR]和[Java/字节码/JVM]的比较:】

最好的办法是首先搞清楚为什么会创造出这些技术来。

     用C和C++写程序,一般是把源代码编译成汇编语言代码,它只能运行在特定的处理器和特定的操作系统上。编译器需要知道目标处理器,因为不同的处理器指令集不同。编译器也要知道目标操作系统,因为不同的操作系统对诸如如何执行工作以及怎样实现象内存分配这些基本的C/C++的概念不同。C/C++这种模型获得了巨大的成功(你所使用的大多数软件可能都是这样编译的),但也有其局限性:

l          程序无丰富的接口以和其它程序进行交互(微软的COM就是为了克服这个限制而创建的)
l          程序不能以跨平台的形式分发
l          不能把程序限制执行在一个安全操作的沙箱里

为了解决这些问题,Java采用了Smalltalk采用过的方式,即编译成字节码,运行在虚拟机里。在被编译前,字节码维持程序的基本结构。这就使得Java程序和其它程序进行各种交互成为可能。字节码也是机器中立的,这也意味着同样的class文件可以运行于不同的平台。最后,Java语言没有显式的内存操作(通过指针)的事实使得它很适合于编写“沙箱程序”。

     最初的虚拟机利用解释器来把字节码指令流转换为机器码。但是这个过程慢得可怕以致于对于那些关注性能的程序员来说,从来都没有吸引力。如今,绝大多数JVM都利用JIT编译器,基本编译成机器码—在进入类框架的范围之前和方法体执行之前。在它运行前,还有可能将Java程序转换为汇编语言,可以避免启动时间和即时编译的内存负担。和编译Visual C++程序相比,这个过程并不需要移去程序对运行时的依赖。Java运行时(这个术语隐藏在术语Java虚拟机下之下)将处理程序执行的很多至关重要的方面,比如垃圾收集和安全管理。运行时也被认为是受控执行环境。

     尽管术语有点含糊不清,尽管从不用解释器,但.NET基本模型也是使用如上所述方式。.NET的重要的改进将来自于IL自身的设计的改进。Java可以匹敌的唯一方式是修改字节码规范以达到严格的兼容。我不想讨论这些改进的细节,这应该留给那些极个别的既了解字节码也了解IL码的开发人员去讨论。99%的象我这样的开发人员不打算去研究IL代码规范,这儿列出了一些意欲改进字节码的IL设计决策:

l          提供更好的类型中立(有助于实现模板);
l          提供更好的语言中立;
l          执行前永远都编译成汇编语言,从不解释;
l          能够向类、方法等加入附加的声明性信息。

目前,CLR还提供多操作系统支持,而且在其它领域还提供了对JVM的更好的互用性的支持。

【元数据matadata和反射reflection:】

元数据:描述数据的数据。c#编译器将代码编译程中间语言,其中它会把元数据写入到exe文件中。
查询元数据的办法就是反射。因为有了元数据和映射,部署程序因此变得简单,不用再机器上注册了。所有的组件都具有了自描述功能。


【受控代码和非受控代码:】
也叫托管代码(managed code),也就是运行在clr之下的代码。反之非受控是不熟.net环境控制的。

【加框和解框:boxing and unboxing】
加框和解框使编写和使用具有通用对象参数的函数变得简单而直接。

 sample1:
  
  class test{
  struct Point
  {
   public int x, y;
   public Point(int x, int y) {
   this.x = x;
   this.y = y;
   }
  }
  
  public static void Main()
  {
   Point p = new Point(10, 10);
   object f = p;
   p.x = 20;
   Console.Write(((Point)f).x);
   Console.Write(p.x);
  }
  }
10,20
 sample2:
class test{
  class Point
  {
   public int x, y;
   public Point(int x, int y) {
   this.x = x;
   this.y = y;
   }
  }
  
  public static void Main()
  {
   Point p = new Point(10, 10);
   object f = p;
   p.x = 20;
   Console.Write(((Point)f).x);
   Console.Write(p.x);
  }
  }
20,20
【cts:公共类型系统】
可以笼统的说它规定了语言的类型的规则:分为值类型和数值类型。单根系统。命名空间定义了作用域。类型安全等等。

【ref and out and params】:

c#种的四种参数形式:
   一般参数
   in参数
   out参数
   params参数数列
ref 和out的 区别是ref参数需要初始化,out不需要。
参数数列能够使多个相关的参数被单个数列代表,换就话说,参数数列就是变量的长度。
void F(params int[] args){}
static void Main() {
  F();
  F(1);
  F(1, 2);
  F(1, 2, 3);
  F(new int[] {1, 2, 3, 4});
  }
  }
【new的用法:】
除了声明对象的引用外,它的作用是:
1.派生类中的方法覆盖基础类的方法实现。
sample:
class A
{
 public void m_a(){Console.writeln("A");}
}
Class A1
{
 new public void m_a(){Console.writeln("A1");}
}
class Amain
{
public static void main()
{
Amain main=new Amain();
A a=new A();
A1 a1=new A1();
a.m_a();
a1.m_a();
}
}

2.如果需要用基类的引用实际访问的派生类的方法。

sample:
class A
{
 public void m_a(){Console.writeln("A");}
}
Class A1
{
 public new void m_a(){Console.writeln("A1");}
}
class Amain
{
public static void main()
{
Amain main=new Amain();
A a=new A1();
a.m_a();

}
}

【virtual || override】

在C#中,如果你在声明一个方法的时候用了virtual这个关键字,那么,在派生类中,你就可以使用override或者new关键字来弃用它或是忽略它.如果你在父类中用了virtual这个关键字,而在其派生类中又没有用override或new关键字,而直接引用一个同名方法的话,编译器将会报错,并将以new方式,即忽略派生类中的方法的方式来运行

你可能感兴趣的:(asp.net)