博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
同构伪代码彻底理解using 指令
阅读量:4878 次
发布时间:2019-06-11

本文共 1514 字,大约阅读时间需要 5 分钟。

下面这段伪代码是我自己总结的,如果有错误请指出,谢谢

 

 1
一定要分清楚C#编译器的要求和CLR的要求。C#的类型定位规则是:
 2
    [方法]Type FindType(
string
 fullname)::
=
在本程序集以及所有被引用的程序集中查找全名(完全限定名)为fullname的类型。本方法不会返回null,如果不存在符合条件的Type或者存在的Type多于一个,则抛出相应的异常。
 3
    
//
level1
 4
    If(typeIdentifier.startWith(“
global
::”))
 5
ExpandedBlockStart.gifContractedBlock.gif    
{    //如果类型标识符以’global::’开头,那么后面的部分构成一个类型全名
 6        //如果没有找到类型,则查找失败
 7        return FindType(typeIdentifier.removePrefixChar(8));
 8}
 9
//
level2
10
//
 NamingContainer是能够在其中定义类型的构造
11
//
 CurrentNamingContainer是包含本类型标识符的最近的类型定义容器(如home class)
12
NamingContainer 
=
 CurrentNamingContainer;
13
do
14
ExpandedBlockStart.gifContractedBlock.gif
{
15try
16ExpandedSubBlockStart.gifContractedSubBlock.gif{    //第一次查找是否是成员,而后依次在更上一级容器中查找
17    
18        return FindType (CurrentNameingContainer.Name  + “.”+ typeIdentifier);
19ExpandedSubBlockStart.gifContractedSubBlock.gif    }
finally{}
20}
21
while
(NamingContainer.parent 
!=
 
global
)
22
//
最后一次查找是否是global中的类型,也就是用typeIdentifier本身作为全名查找
23
    
try
24
ExpandedBlockStart.gifContractedBlock.gif
{
25    return FindType (typeIdentifier);
26ExpandedBlockStart.gifContractedBlock.gif}
finally
{}
27
    
//
以上两个级别的查找先于使用using进行的查找的。
28
29
//
level3
30
List
<
Type
>
 list 
=
 
new
 List
<
Type
>
(
1
);
31
Foreach(usingNSPrefix 
in
 AllUsingNSPrefix)
32
ExpandedBlockStart.gifContractedBlock.gif
{    //所有由using语句引入的命名空间前缀是平级的
33    try
34ExpandedSubBlockStart.gifContractedSubBlock.gif    {
35        list.Add(FindType usingNSPrefix + “.” + (typeIdentifier));
36ExpandedSubBlockStart.gifContractedSubBlock.gif}
finally{}
37}
38
if
(list.Count 
>
 
1
)
39
ExpandedBlockStart.gifContractedBlock.gif
{
40    throw new Exception(“类型名称歧义”);
41}
42
if
(list.Count 
==
 
0
)
43
ExpandedBlockStart.gifContractedBlock.gif
{
44    throw new Exception(“没有找到类型”);
45}
46
return
 list[
0
];
47
//
如果被引用的所有程序集中,定义了全名相同的类,那么在程序中不可引用这个类,否则无论如何会出现异常。根据FindType方法的定义可知,C#编译器是期待包括被编译模块在内的所有程序集中没有全名相同的类,否则FindType方法总会发生异常。
48

level2很巧妙,我们可以通过这个规则来实现一个类以覆盖原来的处于level3的类。

当然这是编辑时的把戏,必须要重新编译代码。

转载于:https://www.cnblogs.com/zhy2002/archive/2008/07/23/1249126.html

你可能感兴趣的文章
导入Excel 时间格式验证
查看>>
序列合并求前K小项 POJ2442
查看>>
unity点选构建Mesh并保存OBJ
查看>>
python kmeans实战 - 单机一层聚类(小玩具哦),下次再弄个分布式多次聚类
查看>>
Java主要有那几种文件类型?各自的作用是什么?
查看>>
我的第一个python web开发框架(29)——定制ORM(五)
查看>>
2017.11.18 手把手教你学51单片机-点亮LED
查看>>
xml的创建与解析
查看>>
grep不区分大小写查找字符串方法
查看>>
全双工和半双工
查看>>
2.1什么是软件需求,什么是功能需求
查看>>
linux系统灵活运用灯[android课程3]
查看>>
Android 通用Dialog中设置RecyclerView
查看>>
利用 Android Studio 和 Gradle 打包多版本APK
查看>>
Android 自定义标题栏
查看>>
Android 如何把一个 RelativeLayout或ImageView背景设为透明
查看>>
HTTP协议详解(真的很经典)
查看>>
hdu2089 不要62 (数位dp)
查看>>
tomcat优化方向
查看>>
fmt.Sprintf strconv.Itoa 效率实验
查看>>