zoukankan      html  css  js  c++  java
  • .NET别名机制简介

        在.NET中using是一个多用途的关键字,除了可以引用命名空间之外,还可以用来进行异常处理。今天我们再来说说用using关键字实现的另一个功能,既定义别名,通俗的讲就是起外号!:)

        using可以为命名空间或是类型定义别名,如果定义在命名空间之外,别名生效的范围就仅限于当前文件;如果定义在命名空间之内,则生效范围为当前代码块与定义别名的命名空间之交集。下面我们就来看看如何用using关键字来为命名空间定义别名:

    using C = System.Console;

    class Program
    {        
        
    static void Main()
        
    {
            C.WriteLine(
    "hello using!");
        }


    }

    可以给命名空间起别名,这在一定程度上方便了我们开发,但是我们有时候会遇到一个新的问题。请看下面的例子:

    //Assebly1中有如下代码:

    namespace Foo.IO
    {
        
    public class Stream
        
    {
        }

    }
    //在Assembly2中有如下代码:
    namespace Foo.IO
    {
        
    public class Stream
        
    {
        }

    }

    namespace FooIO
    {
        
    public class Stream
        
    {
        }

    }

    //然后我们有一个类同时引用了上面的两个程序集

    using FooIO = Foo.IO;
    using CusIO = Custom.IO;

    class Program
    {
        
    static void Main()
        
    {
            FooIO.Stream stream1 
    = new FooIO.Stream();

            CusIO.Stream stream2 
    = new CusIO.Stream();
        }

    }

    注意上面的代码是不能通过编译的,因为编译器不知道FooIO.Stream是指assembly1下的Foo.IO.Stream(该类是通过别名引用的)还是指assembly2下的FooIO.Stream(该类是直接引用的)。这时,我们就要请出“命名空间别名限定符::”来帮忙了,这们用“::”来将上面的代码重写如下,就可以编译通过了。

    using FooIO = Foo.IO;
    using CusIO = Custom.IO;

    class Program
    {
        
    static void Main()
        
    {
            FooIO::Stream stream1 
    = new FooIO::Stream();

            CusIO.Stream stream2 
    = new CusIO.Stream();
        }

    }

    注意,这时stream1是Assembly1中Foo.IO.Stream的一个实例。

    另外还有两个比较特殊的别名符,就是全局限定符和外部限定符。分别示例如下:

    全局限定符:

    using System;
    class Program

        
    const int Console = 123;
        
    static void Main()
        
    {
            
    global::System.Console.WriteLine("yes");
        }

    }
    全局限定符是为了解决在一些大型项目中,有时命名空间的命名会和某个语法元素的名字冲突。如上例中的Console变量与System.Console。
    外部别名:
    // Assembly1 有如下代码:
    namespace FooIO
    {
        
    public class Stream
        
    {
        }

    }


    // Assembly2 有如下代码:
    namespace FooIO
    {
        
    public class Stream
        
    {
        }

    }


    // 下面的代码同时使用了以上两个程序集:
    extern alias AliasAsm1;
    extern alias AliasAsm2;
    class Program
    {
        
    static void Main()
        
    {
            AliasAsm1::FooIO.Stream stream1 
    = new AliasAsm1::FooIO.Stream();
            AliasAsm2::FooIO.Stream stream2 
    = new AliasAsm2::FooIO.Stream();
        }

    }
    请注意,以上代码如果想编辑成功,必须在类库引用属性窗口给Assembly1起一个AliasAsm1的别名,给Assembly2起AliasAsm2的别名;或是直接运行csc.exe /r:AliasAsm1= Assembly1.dll /r:AliasAsm2=Assembly2.dll Program.cs。外部别名允许我们使用定义在两个不同的程序集,但是全名一样的类(这种情况一般发生在我们需要使用一个程序集的不同版本时)。

  • 相关阅读:
    Expression Bland 入门视频(五) 了解对象面板和属性面板
    Windows Phone 一步一步从入门到精通
    “北京今年入冬的第一场雪”,纪念博客园写日志一年了
    2010年即将到来,用我的名字注册了的新域名 TerryFeng.com
    我要在黑龙江的老家,组织一个微软.Net俱乐部
    Windows 7 小工具 问题步骤记录器
    给弟弟起步学习软件开发(.Net 方向)的指导,博友们帮助看看,提些意见给他。
    今天是中国传统节日“重阳节”。也是爷爷的生日,今年80岁高龄。
    Windows 7 远程服务器管理工具 简体中文 下载
    新的技术和概念应该尽可能先去接受,而不是排斥。
  • 原文地址:https://www.cnblogs.com/zhangronghua/p/1135321.html
Copyright © 2011-2022 走看看