C# 命名空间优先级

文章详细解释了C#中类查找的命名空间优先级规则,包括自身namespace、逐层展开、全局空间和using指令的搜索顺序,强调了using指令引入的namespace在全局匹配失败后的平等优先级可能导致的二义性问题。
摘要由CSDN通过智能技术生成

 C# 命名空间优先级如下示例,按序号从小到大优先级从高到底。
 
假设使用类的地方位于最内层 namespace。
可以发现:
1. class C 的绑定决议,会按从C的完全限定名称开始,也就是最内层开始查找匹配,
   然后逐层展开 namespace 直至 global 空间,其中会匹配路径上的第一个匹配。
2. 如果展开至 global 空间仍旧未找到,就会查找 using 指令引入的 namespace。
   注意,using 指令彼此之间顺序无关没有优先级,所有经 using 指令获得的绑定优先级相同。
   例如,下面 class C 若是经 using 指令得到的,比如 N3.C,N3.N6.C,N1.N4.C 三者的优先级一样,如果它们同时可用,则发生二义性编译错误。
     
 结论,class 的查找路径从自身所处 namespace 开始,从自身到 golbal 根空间逐层展开匹配。
 在 global 匹配失败后才查找 using 指令引入的 namesapce。因此,优先级从高到底:
 自身 namespace > 自身路径逐层展开 namespace > global > using 指令(所有using优先级一样,若重名则发生二义性)

// test.cs

using N3;
using N3.N6;
using N1.N4;
using N1.N5;
using N1.N5.N2;

class C { }  // 5

namespace N1
{
    //public class C { }  // 4

    namespace N4
    {
        public class C { }  // 6
    }

    namespace N5
    {
        //public class C { }  // 3

        namespace N2
        {
            //public class C { }  // 2

            public class T
            {
                //public class C { }  // 1

                static void M()
                {
                    C c = new C();  // 使用处
                }
            }
        }
    }
}

namespace N3
{
    public class C { }  // 6

    namespace N6
    {
        public class C { }  // 6
    }
}

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
动态优先级是指随着任务的执行情况,任务的优先级可以动态调整。实现动态优先级的一种常见方法是使用优先队列,也称为堆。 在C#中,可以使用System.Collections.Generic命名空间下的PriorityQueue<T>类来实现优先队列。下面是一个简单的示例,演示如何使用优先队列实现动态优先级: ```csharp using System; using System.Collections.Generic; class Task { public int Id { get; set; } public int Priority { get; set; } } class Program { static void Main(string[] args) { PriorityQueue<Task> queue = new PriorityQueue<Task>(); // 添加任务 queue.Enqueue(new Task { Id = 1, Priority = 5 }); queue.Enqueue(new Task { Id = 2, Priority = 2 }); queue.Enqueue(new Task { Id = 3, Priority = 3 }); // 执行任务 while (queue.Count > 0) { Task task = queue.Dequeue(); Console.WriteLine("执行任务 {0},优先级为 {1}", task.Id, task.Priority); task.Priority--; // 降低任务优先级 if (task.Priority > 0) { queue.Enqueue(task); // 重新加入队列 } } } } ``` 在这个示例中,我们定义了一个Task类,包含任务的Id和Priority属性。我们使用PriorityQueue<Task>类来实现优先队列,将任务按照优先级加入队列中。然后,我们使用while循环不断从队列中取出任务执行,执行完毕后将任务的优先级降低,并重新加入队列中。这样,优先级较高的任务会先被执行,而优先级较低的任务会在后面被执行,实现了动态优先级
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值