1.using指令。using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到。
例如:using System; 一般都会出现在*.cs中。
2.using别名。using + 别名 = 包括详细命名空间信息的具体的类型。
这种做法有个好处就是当同一个cs引用了两个不同的命名空间,但两个命名空间都包括了一个相同名字的类型的时候。当需要用到这个类型的时候,就每个地方都要用详细命名空间的办法来区分这些相同名字的类型。而用别名的方法会更简洁,用到哪个类就给哪个类做别名声明就可以了。注意:在.net3.5中并不需要给用到的重名的每个类都起别名,当然重名了用到的时候都起别名更好。
- namespace NameSpace1
- {
- public class MyClass
- {
- public override string ToString()
- {
- return "You are in NameSpace1.MyClass";
- }
- }
- }
- namespace NameSpace2
- {
- class MyClass
- {
- public override string ToString()
- {
- return "You are in NameSpace2.MyClass";
- }
- }
- }
- namespace testUsing
- {
- using System;
- //这里重名的两个类都起了别名,实际上3.5中不需要都起别名
- using aClass = NameSpace1.MyClass;
- using bClass = NameSpace2.MyClass;
- class Class1
- {
- static void Main(string[] args)
- {
- aClass my1 = new aClass();
- Console.WriteLine(my1);
- bClass my2 = new bClass();
- Console.WriteLine(my2);
- Console.WriteLine("Press any key");
- Console.Read();
- }
- }
- }
- .class private auto ansi beforefieldinit Class1
- extends [mscorlib]System.Object
- {
- .method public hidebysig specialname rtspecialname instance void .ctor() cil managed
- {
- .maxstack 8
- L_0000: ldarg.0
- L_0001: call instance void [mscorlib]System.Object::.ctor()
- L_0006: ret
- }
- .method private hidebysig static void Main(string[] args) cil managed
- {
- .entrypoint
- .maxstack 1
- .locals init (
- [0] class NameSpace1.MyClass my1,
- [1] class NameSpace2.MyClass my2
-
- )
- L_0000: nop
- L_0001: newobj instance void NameSpace1.MyClass::.ctor()
- L_0006: stloc.0
- L_0007: ldloc.0
- L_0008: call void [mscorlib]System.Console::WriteLine(object)
- L_000d: nop
- L_000e: newobj instance void NameSpace2.MyClass::.ctor()
- L_0013: stloc.1
- L_0014: ldloc.1
- L_0015: call void [mscorlib]System.Console::WriteLine(object)
- L_001a: nop
- L_001b: ldstr "Press any key"
- L_0020: call void [mscorlib]System.Console::WriteLine(string)
- L_0025: nop
- L_0026: call int32 [mscorlib]System.Console::Read()
- L_002b: pop
- L_002c: ret
- }
- }
3.using语句,定义一个范围,在范围结束时处理对象。
场景:
当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose方法。
要达到这样的目的,用try...catch来捕捉异常也是可以的,但用using更方便。
这里需要注意的就是using()里声明的对象所属的类必须是实现了IDispose()接口的类型,如果该类没有实现IDisposable接口,编译器就会很生气,抛出一个错:Error type used in a using statement must be implicitly convertible to 'System.IDisposable'!!!
另外提醒大家,using()里并不是只可以声明一个变量,是可以声明好多变量的!!!
例如:
- using System;
- namespace NameSpace1
- {
- public class MyClass : IDisposable
- {
- public override string ToString()
- {
- return "You are in NameSpace1.MyClass";
- }
- public void Dispose()
- {
- Console.WriteLine("i am in dispose function!");
- }
- }
- }
- namespace testUsing
- {
- using aClass = NameSpace1.MyClass;
- class Class1
- {
- static void Main(string[] args)
- {
- using(aClass oTest = new aClass())
- {
- oTest.ToString();
- }
- Console.WriteLine("Press any key");
- Console.Read();
- }
- }
- }
MyClass类的反编译代码,平淡无奇,构造器、Dispose方法、 ToString方法:
- .class public auto ansi beforefieldinit MyClass
- extends [mscorlib]System.Object
- implements [mscorlib]System.IDisposable
- {
- .method public hidebysig specialname rtspecialname instance void .ctor() cil managed
- {
- .maxstack 8
- L_0000: ldarg.0
- L_0001: call instance void [mscorlib]System.Object::.ctor()
- L_0006: ret
- }
- .method public hidebysig newslot virtual final instance void Dispose() cil managed
- {
- .maxstack 8
- L_0000: nop
- L_0001: ldstr "i am in dispose function!"
- L_0006: call void [mscorlib]System.Console::WriteLine(string)
- L_000b: nop
- L_000c: ret
- }
- .method public hidebysig virtual instance string ToString() cil managed
- {
- .maxstack 1
- .locals init (
- [0] string CS$1$0000)
- L_0000: nop
- L_0001: ldstr "You are in NameSpace1.MyClass"
- L_0006: stloc.0
- L_0007: br.s L_0009
- L_0009: ldloc.0
- L_000a: ret
- }
- }
- .class private auto ansi beforefieldinit Class1
- extends [mscorlib]System.Object
- {
- .method public hidebysig specialname rtspecialname instance void .ctor() cil managed
- {
- .maxstack 8
- L_0000: ldarg.0
- L_0001: call instance void [mscorlib]System.Object::.ctor()
- L_0006: ret
- }
- .method private hidebysig static void Main(string[] args) cil managed
- {
- .entrypoint
- .maxstack 2
- .locals init (
- [0] class NameSpace1.MyClass oTest,
- [1] bool CS$4$0000)
- L_0000: nop
- L_0001: newobj instance void NameSpace1.MyClass::.ctor()
- L_0006: stloc.0
- L_0007: nop
- L_0008: ldloc.0
- L_0009: callvirt instance string [mscorlib]System.Object::ToString()
- L_000e: pop
- L_000f: nop
- L_0010: leave.s L_0022
- L_0012: ldloc.0
- L_0013: ldnull
- L_0014: ceq
- L_0016: stloc.1
- L_0017: ldloc.1
- L_0018: brtrue.s L_0021
- L_001a: ldloc.0
- L_001b: callvirt instance void [mscorlib]System.IDisposable::Dispose()
- L_0020: nop
- L_0021: endfinally
- L_0022: nop
- L_0023: ldstr "Press any key"
- L_0028: call void [mscorlib]System.Console::WriteLine(string)
- L_002d: nop
- L_002e: call int32 [mscorlib]System.Console::Read()
- L_0033: pop
- L_0034: ret
- .try L_0007 to L_0012 finally handler L_0012 to L_0022
- }
- }
L_0000到 L_0006中即创建一个Class1的对象,并赋给变量 oTest。
L_0008到 L_000e中即执行 oTest的 ToString()。
L_0012到 L_0021即判断 oTest这个时候是不是null,如果时null,则啥都不做了,到 endfinally那去了。
如果不为null,则执行 oTest. Dispose()。
不太懂IL语言的朋友,也可以从最后一句 . try L_0007 to L_0012 finally handler L_0012 to L_0022中看出来确实using在这里是相当于try{...}finally{调用对象的dispose方法}的。