[你必须知道的.NET]第二十八回:说说Name这回事儿

1 缘起

老赵在谈表达式树的缓存(2):由表达式树生成字符串中提到,在描述Type信息时讨论FullName或者AssemblyQualifiedName提供完整的Type信息,虽是小话题,但却是值得有聊的话题。在.NET中反应一个Type名称信息的有以下三个属性,分别是:

  • Name,获取当前成员的名称。
  • FullName,获取Type 的完全限定名,包括Type的命名空间,但不包括程序集。
  • AssemblyQualifiedName,获取Type的程序集限定名,其中包括从中加载Type 的程序集的名称。事实上,AssemblyQualifiedName被定义为只读abstract属性,具体的实现由其派生类来实现,例如TypeBuilder,我们可以根据其具体实现类型对此有个大致的了解。

此处的定义毋庸置疑是官方的(MSDN),俗话说,事实是检验真理的唯一标准,那么这三个相近的概念,究竟代表了怎样的不同,我们回到事实近看分晓。

2 畅聊Name

2.1 由简单的开始

由简单开始,我们不妨看看object的三个不同Name返回的事实真相:

static void Main(string[] args)
{Type t1 = typeof(object);Console.WriteLine(t1.Name);Console.WriteLine(t1.FullName);Console.WriteLine(t1.AssemblyQualifiedName);
}

执行结果呢?

诚如MSDN所说,Name返回了简单的类型名称,FullName包含命名空间,而AssemblyQualifiedName则包含程序集全名称。而对于非强名称程序集,其AssemblyQualifiedName依然返回,相关的程序集信息,例如:

Console.WriteLine(t3.AssemblyQualifiedName);

Anytao.Learning.ExpressionTree.One, Anytao.Learning.ExpressionTree, Version=1.0. 
0.0, Culture=neutral, PublicKeyToken=null

2.2 向复杂过度

如果我们只把目光停留在简单类型,那么这三个家伙也不值得花点小时间来注意了,除了简单,还得复杂。所以,我饶尤其是的把Expression拿来抓丁了:

static void Main(string[] args)
{Type t2 = typeof(Expression<Func<int, int>>);Console.WriteLine(t2.Name);Console.WriteLine(t2.FullName);Console.WriteLine(t2.AssemblyQualifiedName);
}

执行的结果呢?

显然,对于答案,引起我们关注的是在Expression<Func<int, int>>中,其FullName的Func<int, int>类型,以及int类型均获取到其AssemblyQualifiedName,而不是FulName。这留给我们一个大大的疑问,对其原因进行一点点深究,我们就可以有这样的思考,Func<T>以及int分别存在于System.Core和mscorlib程序集,对于我们本身程序集而言,完全有可能在其他引用程序集中引入一个FullName相同的Assembly,所以为唯一限定起见,以AssemblyQualifiedName标示Func<T>和int是完全正确的。

同意的问题,存在于List<T>等其他类型。任何可替换类型参数的实际类型,都可能由不同程序集的加载而变得不够“唯一”,所以AssemblyQualifiedName来限定List<T>的FullName是明智的。

2.3 顺便看看Type.ToString()

Type类型还有一个ToString(),用于返回Type的Name,那么这个Name究竟是这三个中的哪一个呢?如果看了答案,你肯定又一次崩溃:

static void Main(string[] args)
{Type t1 = typeof(object);Type t2 = typeof(Expression<Func<int, int>>);Type t3 = typeof(One);Type t4 = typeof(List<int>);Console.WriteLine(t1.ToString());Console.WriteLine(t2.ToString());Console.WriteLine(t3.ToString());Console.WriteLine(t4.ToString());
}
我们看看此时的结果:

虽然很无语,Type.ToString()事实上并未返回Name、FullName或者AssemblyQualifiedName,而是不完全的FullName,具体就不做过多陈述了,我们可以由结果看得很明白。

3 回到问题

显然,FullName在一个程序集中是唯一限定的,包含了所在的命名空间,而AssemblyQualifiedName则更包含其程序集名称,对于复杂类型的例如List<T>这样的类型,即便是FullName也将以AssemblyQualifiedName显示其类型参数,所以对于老赵的方案FullName是完全可以胜任为不同Type实现唯一key值的需求。

你认为呢?

 

支持(0) 反对(0)

  

#3楼 2009-03-18 03:48 飞林沙

呵呵,这么晚了,应该没人和我抢座位了,第一次先看后顶! 
我感觉微软是推荐我们去使用FullName作为一个类的完整名字(其中包括泛型的不同版本)...... 而像AssemblyQualifiedName,应该属于是非主流属性了吧

支持(0) 反对(0)

  

#4楼 2009-03-18 07:16 Anders Liu

建议应该捎带着说说命名空间。其实命名空间没什么大用,无非就是解决同一个程序集里的命名冲突。所以,像类型啊、成员啊什么的,在源数据库都有自己的表,甚至有的还有不止一张表;而命名空间只是TypeDef的一个列而已。

3楼说得有道理,其实FullName(命名空间+名称)才是类的完整名字,Name可以看座一个简写了。但3楼也不准确,FullName并不是“类的唯一标记”,类的唯一标记应该包括全限定的程序集名称和类的完整名称(如System.Object,mscorlib, version=2.0...., culture=nature, publickeytoken=....这样)。

支持(0) 反对(0)

  

#5楼 2009-03-18 08:15 紫色永恒

又见非主流属性啊。。

支持(0) 反对(0)

  

#6楼 2009-03-18 09:08 Jeffrey Zhao

@飞林沙 
类的唯一标记难道不是AssemblyQualifiedName吗?不同Assembly下也可以由namespace+class相同的类型阿

支持(0) 反对(0)

  

#7楼 2009-03-18 09:26 飞林沙

@Jeffrey Zhao 

恩,是我错了。天真化了,道歉

支持(0) 反对(0)

  

#8楼 2009-03-18 09:27 飞林沙

@Jeffrey Zhao 

修改了

支持(0) 反对(0)

  

#9楼 [楼主] 2009-03-18 10:50 Anytao

@施炯 
呵呵,还不算晚,发表之后准备关机:-) 

这是老习惯了

支持(0) 反对(0)

  

#10楼 [楼主] 2009-03-18 10:51 Anytao

@Jeffrey Zhao 
呵呵,这话言重了,是我佩服你,刚好若干天前关注过这个问题,看到你的文中提到就顺便组织组织思路了。 

哈哈:-)

支持(0) 反对(0)

  

#11楼 [楼主] 2009-03-18 10:53 Anytao

@飞林沙 
一般情况下,以FullName进行限定是完全没有问题的,但是这个非主流的说法,嘿嘿,我就不晓得怎么回答了

支持(0) 反对(0)

  

#12楼 [楼主] 2009-03-18 10:55 Anytao

@Anders Liu 
呵呵,那有时间我就补充补充命名空间,因为和“Name这回事儿”有关系,如果从Metadata的角度去考量,那就更有说道了。 

关于AssemblyQualifiedName,我完全同意你的观点,这也是List<T>获取FullName时不能唯一限定而采用AssemblyQualifiedName策略的原因呐:-)

支持(0) 反对(0)

  

#13楼 [楼主] 2009-03-18 10:56 Anytao

@紫色永恒 
今天,第二次听到“非主流”,哈哈,与时俱进

支持(0) 反对(0)

  

#14楼 [楼主] 2009-03-18 10:56 Anytao

@Jeffrey Zhao 
@飞林沙 
你俩都讨论完了,我看看热闹就行了

支持(0) 反对(0)

  

#15楼 2009-03-18 11:44 Jeffrey Zhao

@Anytao 
今年是牛年,我们都爱“非主牛”。

支持(0) 反对(0)

  

#16楼 [楼主] 2009-03-18 13:01 Anytao

@Jeffrey Zhao 
哈哈,你指猫扑上的吧:-)

支持(0) 反对(0)

  

#17楼 2009-03-19 08:27 999999999999999

看来有很多细节问题,我都不知道呀

支持(0) 反对(0)

  

#18楼 [楼主] 2009-03-19 10:32 Anytao

@wxws 
嘿嘿,很多细节,也是试过了才知道。

支持(0) 反对(0)

  

#19楼 2009-07-13 16:27 大樹

好文,《你必须知道的.NET》一看一半,收获颇丰。我想还得继续文虎而知新,继续实战。

支持(0) 反对(0)

  

#20楼 2009-07-13 16:28 大樹

好文,《你必须知道的.NET》已看一半,收获颇丰。我想还得继续温故而知新,继续实战。


---------------------
不留神,怎么那么多错别字呢!

支持(0) 反对(0)

  

#21楼 2009-12-13 20:10 ☆用心生活☆

学习了,很受用

支持(0) 反对(0)

  

#22楼 2010-09-11 16:34 cuishengli

是否有这个可能,AssemblyQualifiedName是新增的用于替代fullname的属性,但是为了兼容旧版本,就保留了fullname。
并且在AssemblyQualifiedName推出之前,发现fullname不唯一的bug,为了赶时间,就把fullname增加限定的内容。
保险起见,并且根据一致性的原则选择使用AssemblyQualifiedName更好一些。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

library的英语怎么读音_【英语角】———学习方法分享

点击蓝字 关注我们每天学习一点点单词的记忆是一件很让人头疼的事情&#xff0c;但单词又是学习英语的基石&#xff0c;非常重要。那么有什么方法能让单词记忆变得简单有效呢&#xff1f;不妨试试下面这些方法吧。1、卡片记忆自制单词卡片&#xff0c;随身带着&#xff0c;有空…

计算机作文叙事,电脑争夺战叙事作文

电脑争夺战叙事作文在生活、工作和学习中&#xff0c;大家一定都接触过作文吧&#xff0c;作文是通过文字来表达一个主题意义的记叙方法。那么你有了解过作文吗&#xff1f;下面是小编帮大家整理的电脑争夺战叙事作文&#xff0c;欢迎阅读与收藏。这是一个温暖的下午&#xff0…

[你必须知道的.NET]第二十九回:.NET十年(上)

引言 语言是程序开发者行走江湖的手上利器&#xff0c;各大门派的高手在论坛、博客为了自家门派争吵不已早是技术世界中的亮丽风景&#xff0c;虽多少为刚刚踏入江湖的新手提供了思考的素材&#xff0c;但也同时迷惑了初出茅庐的前行方向。 本文不欲计较门派的高下&#xff0…

springboot 做表白墙_华广表白墙 第六期|hsl每天都想和你嘻嘻哈哈

1回复第五期 10 没了就没了&#xff0c;不值得就要留恋219级人力4班的银发女生看见你的第一眼就觉得你是一个天使&#xff0c;你的眼睛真的把我迷住了。如果可以的话能不能加你的微信&#xff0c;谢谢?3捞一下13号(周日晚上)21.15左右在校门口益禾堂买奶茶的小姐姐 金发 牛仔…

51系列计算机字长,计算机等级考试之MsOffice练习题第51套

为了让广大各位考生更好的复习&#xff0c;帮考网小编整理提供了2012计算机等级考试一级MsOffice精选题(51)&#xff0c;以供各位考生复习参考&#xff0c;希望对考生复习有所帮助。/计算机二级2012计算机等级考试一级MsOffice精选题(51)1)。 正确的IP地址是A) 202.112.111.1B)…

navcat定时备份mysql_Linux实现MYSQl数据库的定时备份

今天给大家分享一下如何在Linux下实现MYSQl数据库的定时备份。前提需要保证你的Linux服务器已经安装了MYSQl数据库服务。1、创建shell脚本vim backupdb.sh创建脚本内容如下&#xff1a;#!/bin/shdb_user"root"db_passwd"123456"db_name"userdb"n…

[你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望

总体来说&#xff0c;这是一篇介绍性的文章&#xff0c;不会涉及过多技术细节和研究过程。但是&#xff0c;作为拉开序幕的第一页&#xff0c;本文以提纲挈领的方式展开对.NET 4.0的初次体验。从What’s new的角度&#xff0c;开始我对.NET 4.0新特性的探索之旅。既然是介绍&am…

苹果计算机磁盘格式,Mac怎么将ntfs格式的磁盘格式化

1. 首先下载NTFS For Mac。下载之后就可以读取NTFS磁盘。2. 插入要格式化的NTFS磁盘。您可以在Mac OS X下通过命令行格式化NTFS磁盘。按照以下步骤进行操作&#xff1a;启动命令行&#xff1a;应用程序 》 工具 》 终端; 输入diskutil获取帮助。格式化命令图&#xff1a;使用di…

[你必须知道的.NET]第三十二回,,深入.NET 4.0之,Tuple一二

Tuple&#xff0c;是函数式编程的概念之一&#xff0c;早见于Elang、F#等动态语言。不过&#xff0c;我第一次听说Tuple还早在2005年园子的Ninputer大牛提出在.NET 2.0实现Tuple的基本想法&#xff0c;我们可以通过以下地址仰慕当时的历史片段&#xff1a; 探讨.NET 2.0中Tuple…

支持商用吗_可商用的插画素材 | 美翻了

好素材在手&#xff0c;天下我有啊...哈哈哈喽大家周末好&#xff0c;那上周公子做的那份工作型插画模板呢&#xff0c;很多小伙伴都来问我素材是哪里找的&#xff0c;自己画的吗当然不是了&#xff01;其实我在文章中已经提到了&#xff0c;那有的人可能之前用过或可以自己找到…

永恒边境白羊座服务器维护,永恒边境升级攻略 速升50级技巧

永恒边境怎么升级快&#xff1f;分享永恒边境升级攻略&#xff0c;下面我们就一起来看看永恒边境速刷主线支线任务技巧&#xff0c;希望对大家有所帮助。20-30级篇在这个阶段&#xff0c;我们就主线任务和支线任务大家都不要错过了&#xff0c;都要好好抓住&#xff0c;我还可以…

格式化css文件,css文件格式化脚本的方法

这次给大家带来css文件格式化脚本的方法&#xff0c;css文件格式化脚本的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。#!/usr/bin/python# -*- coding: UTF-8 -*-import sys,osdef format(ddt):ddt ddt.replace(\n,)#去除换行ddtddt.replace(;},}).…

[你必须知道的.NET]第三十四回,object成员,不见了!

在.NET世界了&#xff0c;object是公认的造物主&#xff0c;其麾下的7大成员&#xff0c;个顶个的横行在任何系统的任何代码角落。 public class Object {public Object();public virtual bool Equals(object obj);public static bool Equals(object objA, object objB);publi…

直接请求接口_http类型的post和get接口测试

我们做接口测试时候&#xff0c;会发现通常需要测试的接口类型有好几种&#xff0c;比较多的是http类型的接口&#xff0c;其他还有webservice接口&#xff0c;rpc接口等等&#xff0c;本次主要说下http类型的接口我们该怎么测试&#xff0c;还有该测试哪些东西。HTTP接口概念:…

css3加载中动画效果,CSS3实现加载中的动画效果

Loading 的菊花图形组合的不太好&#xff0c;基本上实现这个功能了动画解析这个动画用到的 CSS3 特性:transform 主要使用 transform 属性的 rotate&#xff0c;将线条组合成 Loading 图形 (也就是常见的菊花图形)animation 实现将线条颜色由浅到深&#xff0c;再由深到浅来回变…

[你必须知道的.NET]第三十五回,判断dll是debug还是release,这是个问题

问题的提出 晚上翻着群里的聊天&#xff0c;发现一个有趣的问题&#xff1a;如何通过编码方式来判断一个dll或者exe为debug build还是release build&#xff1f;由于没有太多的讨论&#xff0c;所以我只好自己找点儿办法&#xff0c;试图解决这个问题&#xff0c;为夜生活带点…

执行本地sql_实用!5个在线 SQL 数据库环境

文章目录SQL FiddleDB Fiddledb<>fiddleSQL OnlineOracle Live SQL总结大今天给大家分享几个在线的免费 SQL 运行环境&#xff0c;也就是在线数据库。这些网站可以帮助我们快速运行一些 SQL 语句的测试或者验证&#xff0c;同时还可以在网络上进行分享&#xff0c;关键不…

ocp证书怎么考_没有基础怎么考初级会计证书?

初级会计证书这些年来越发火热&#xff0c;报考门槛也较低。多数报考初级会计证的考生都是没有基础的&#xff0c;那么怎么复习呢?今天会计网将给大家带来没有基础怎么考初级会计证书?1、制定一份适合自己的学习计划&#xff0c;分阶段学习对于没有基础的考生而言&#xff0c…

与gps优缺点_长缨在手,敢缚苍龙,中国北斗三号圆满收官,相比美国GPS怎样?...

2020年6月23日&#xff0c;北斗三号最后一颗全球组网卫星发射成功&#xff0c;完美收官。我们都知道信息化时代定位导航的重要性&#xff0c;那么中国北斗和美国GPS相对比怎么样呢&#xff1f;首先来了解一下北斗。中国的北斗导航系统是分三步建设的。卫星导航系统第一步在1994…

11单件模式(Singleton Pattern)

创建型模式---单件模式(Singleton Pattern)动机&#xff08;Motivation): 在软件系统中&#xff0c;经常有这样一些特殊的类&#xff0c;必须保证它们在系统中只存在一个实例&#xff0c;才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器&#xff0c;…