[你必须知道的.NET]第三十四回,object成员,不见了!
在.NET世界了,object是公认的造物主,其麾下的7大成员,个顶个的横行在任何系统的任何代码角落。
public class Object {public Object();public virtual bool Equals(object obj);public static bool Equals(object objA, object objB);public virtual int GetHashCode();public Type GetType();protected object MemberwiseClone();public static bool ReferenceEquals(object objA, object objB);public virtual string ToString(); }
关于object的故事,有很多很多。而今天的故事则着眼于“为熟悉的朋友做点儿不熟悉的事儿”。相信吗?我的Object成员不见了,不信你可以欣赏一下消失了的object成员。
哈哈!清新多了吧,比起下面常见的编码方式:
是不是让人不知所挫。大概说来,任何时候,在长长的成员方法列表中,你总能看到他们的身影,谁让object是万物的基类呢?不过,有些时候,我可能希望眼根清净,屏蔽掉不会使用的父类成员,使得方法调用变得更加简洁,就像上面的IObject成员一样。
那么这一切是如何做到的呢?虽然我是一个诚实的人,但是其实这是一次赤裸裸的欺骗,而行骗的家伙就是将要闪亮登场的:
namespace System.ComponentModel {[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate)]public sealed class EditorBrowsableAttribute : Attribute{} }
是的,正是System.CompentModel.EditorBrowsableAttriute。以上例而言,我其实为AnyObject类实现了下面的编码:
public interface IObject : IAnyObject {void About(); }
public class AnyObject : IObject {public void About(){} }
其中的核心在于IAnyObject的定义:
namespace Anytao.Core.Common {/// <summary>/// A common interface for any object/// </summary>[EditorBrowsable(EditorBrowsableState.Never)]public interface IAnyObject{[EditorBrowsable(EditorBrowsableState.Never)]bool Equals(object obj);[EditorBrowsable(EditorBrowsableState.Never)]int GetHashCode();[EditorBrowsable(EditorBrowsableState.Never)]Type GetType();[EditorBrowsable(EditorBrowsableState.Never)]string ToString();} }
在通常的情况下,我的Anytao.Core.Common基础组件中都提供一个通用的IAnyObject接口,该接口的作用就是将object成员魔术般的隐藏掉,就如同本文开始的IObject一样。
所以,我们回到System.CompentModel.EditorBrowsableAttriute特性,就可以了解到其作用就是:标识一个类或者属性在编辑器中的可见性。
那么,难道他们真的消失了吗?继续应用一开始的代码:
class Program {static void Main(string[] args){IObject obj = new AnyObject();Console.WriteLine(obj.ToString());} }
我们发现虽然ToString对obj是不可见的,但是运行时调用仍然没有问题,所以,总体说来System.ComponentModel.EditorBrowsableAttribute只是一个障眼法,在此实现了对Visual Studio智能感知的控制。其中EditorBrowsableState选项主要包括了:
- Advanced,针对高级成员的选项设置,同样的方式可以应用Visual Studio的Options->Text Editor->C#->General的Hide advanced members设置。
- Always,总是可见。
- Never,总是不可见。
注意:在Visual C#中,EditorBrowsableAttribute并不对同一程序集的成员有效。
还等什么?也去试试吧?另外关于编辑器,还有很多好玩的特性值得挖掘,贵在发现的力量。
参考文献
- Show Advanced Members in Visual Studio,http://www.blackwasp.co.uk/ShowAdvancedMembers.aspx
[你必须知道的.NET]第三十四回,object成员,不见了!相关推荐
- [你必须知道的.NET]第三十五回,判断dll是debug还是release,这是个问题
问题的提出 晚上翻着群里的聊天,发现一个有趣的问题:如何通过编码方式来判断一个dll或者exe为debug build还是release build?由于没有太多的讨论,所以我只好自己找点儿办法,试图 ...
- [你必须知道的.NET]第三十二回,,深入.NET 4.0之,Tuple一二
anytao.net | <你必须知道的.NET>网站 | Anytao技术博客 发布日期:2009.06.01 作者:Anytao © 2009 Anytao.com ,Anytao原 ...
- [你必须知道的.NET]第三十回:.NET十年(下)
引言 语言是程序开发者行走江湖的手上利器,各大门派的高手在论坛.博客为了自家门派争吵不已早是技术世界中的亮丽风景,虽多少为刚刚踏入江湖的新手提供了思考的素材,但也同时迷惑了初出茅庐的前行方向. 本文不 ...
- [你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望
总体来说,这是一篇介绍性的文章,不会涉及过多技术细节和研究过程.但是,作为拉开序幕的第一页,本文以提纲挈领的方式展开对.NET 4.0的初次体验.从What's new的角度,开始我对.NET 4.0 ...
- 《东周列国志》第三十四回 宋襄公假仁失众 齐姜氏乘醉遣夫
话说楚成王假饰乘车赴会,跟随人众俱是壮丁,内穿暗甲,身带暗器,都是成得臣.斗勃选练来的,好不勇猛.又遣蔿吕臣.斗般二将统领大军,随后而进,准备大大厮杀.宋襄公全然不知,堕其圈套,正是:"没心 ...
- [你必须知道的.NET]第三十三回,深入.NET 4.0之,LazyT点滴
对象的创建方式,始终代表了软件工业的生产力方向,代表了先进软件技术发展的方向,也代表了广大程序开发者的集体智慧.以new的方式创建,通过工厂方法,利用IoC容器,都以不同的方式实现了活生生实例成员的创 ...
- [你必须知道的.NET] 第三回:历史纠葛:特性和属性
本文将介绍以下内容: • 定制特性的基本概念和用法 • 属性与特性的区别比较 • 反射的简单介绍 1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间来了解本文的内容 ...
- [导入][你必须知道的.NET] 第三回:历史纠葛:特性和属性
摘要: 博客园中,关于attribute的讨论不是很多,所以本文也有了存在的意义.attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间来了解本文的内容,走进一个发现attribu ...
- Linux必会100个命令(三十四)which,whereis,locate
70.which which命令用于查找文件.它在环境变量$PATH设置的目录里查找符合条件的文件. 格式: which 文件名 例1:查找文件find 71.whereis whereis命令也用于 ...
最新文章
- Java12和Jdk12安装以及OpenJdk12源码
- 神策数据:游戏买量与长线运营的数据宝典
- 大会剧透 | IDEA大会精彩议题全释放
- 第六届蓝桥杯决赛JavaC组真题——详细答案对照(完整版)
- nginx汇总(z)
- MySQL5.6 部署MHA
- 织梦autoindex应用 dedecms循环中判断第几条数据
- supermap iserver端口介绍
- Python爬虫入门教程24:下载某网站付费文档保存PDF
- PHP判断是手机端访问还是PC端访问网站
- Graphics详解
- 【修真院“善良”系列之十】初级Java程序员的学习路线 1
- 史上最难的大学专业 计算机 土木建筑 医学,大学最易挂科的专业,智商不够别报考,不然很难毕业!...
- 网吧台式计算机配置,2017网吧电脑配置
- 初始C语言——字符串,转义字符,循环语句
- 2020,不会分布式怎么可以,这2份pdf共1000+,从原理到系统实现都包含了
- RAC 主机内存条故障导致的一个节点重启
- java通信:远程画板
- 如何进行120hz的屏幕录像 OBS
- 房子也许是租来的,但生活不是
热门文章
- Linux卸载MariaDB
- C/C++ 面试题记录
- 581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
- BZOJ2286 : [Sdoi2011]消耗战
- HttpModules 管道过滤 自定义页面
- poj 3009 Curling 2.0 (dfs的应用)
- 378. Kth Smallest Element in a Sorted Matrix
- [剑指offer][JAVA]面试题第[33]题[二叉搜索树的后序遍历][单调栈][递归分治]
- c语言分量的运算符,C语言基础(04-运算符和表达式)
- python做接口自动化测试仪器经销商_Python接口自动化测试的实现