在.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成员,不见了!相关推荐

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

    问题的提出 晚上翻着群里的聊天,发现一个有趣的问题:如何通过编码方式来判断一个dll或者exe为debug build还是release build?由于没有太多的讨论,所以我只好自己找点儿办法,试图 ...

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

    anytao.net | <你必须知道的.NET>网站 | Anytao技术博客  发布日期:2009.06.01 作者:Anytao © 2009 Anytao.com ,Anytao原 ...

  3. [你必须知道的.NET]第三十回:.NET十年(下)

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

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

    总体来说,这是一篇介绍性的文章,不会涉及过多技术细节和研究过程.但是,作为拉开序幕的第一页,本文以提纲挈领的方式展开对.NET 4.0的初次体验.从What's new的角度,开始我对.NET 4.0 ...

  5. 《东周列国志》第三十四回 宋襄公假仁失众 齐姜氏乘醉遣夫

    话说楚成王假饰乘车赴会,跟随人众俱是壮丁,内穿暗甲,身带暗器,都是成得臣.斗勃选练来的,好不勇猛.又遣蔿吕臣.斗般二将统领大军,随后而进,准备大大厮杀.宋襄公全然不知,堕其圈套,正是:"没心 ...

  6. [你必须知道的.NET]第三十三回,深入.NET 4.0之,LazyT点滴

    对象的创建方式,始终代表了软件工业的生产力方向,代表了先进软件技术发展的方向,也代表了广大程序开发者的集体智慧.以new的方式创建,通过工厂方法,利用IoC容器,都以不同的方式实现了活生生实例成员的创 ...

  7. [你必须知道的.NET] 第三回:历史纠葛:特性和属性

    本文将介绍以下内容: • 定制特性的基本概念和用法 • 属性与特性的区别比较 • 反射的简单介绍 1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间来了解本文的内容 ...

  8. [导入][你必须知道的.NET] 第三回:历史纠葛:特性和属性

    摘要: 博客园中,关于attribute的讨论不是很多,所以本文也有了存在的意义.attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间来了解本文的内容,走进一个发现attribu ...

  9. Linux必会100个命令(三十四)which,whereis,locate

    70.which which命令用于查找文件.它在环境变量$PATH设置的目录里查找符合条件的文件. 格式: which 文件名 例1:查找文件find 71.whereis whereis命令也用于 ...

最新文章

  1. Java12和Jdk12安装以及OpenJdk12源码
  2. 神策数据:游戏买量与长线运营的数据宝典
  3. 大会剧透 | IDEA大会精彩议题全释放
  4. 第六届蓝桥杯决赛JavaC组真题——详细答案对照(完整版)
  5. nginx汇总(z)
  6. MySQL5.6 部署MHA
  7. 织梦autoindex应用 dedecms循环中判断第几条数据
  8. supermap iserver端口介绍
  9. Python爬虫入门教程24:下载某网站付费文档保存PDF
  10. PHP判断是手机端访问还是PC端访问网站
  11. Graphics详解
  12. 【修真院“善良”系列之十】初级Java程序员的学习路线 1
  13. 史上最难的大学专业 计算机 土木建筑 医学,大学最易挂科的专业,智商不够别报考,不然很难毕业!...
  14. 网吧台式计算机配置,2017网吧电脑配置
  15. 初始C语言——字符串,转义字符,循环语句
  16. 2020,不会分布式怎么可以,这2份pdf共1000+,从原理到系统实现都包含了
  17. RAC 主机内存条故障导致的一个节点重启
  18. java通信:远程画板
  19. 如何进行120hz的屏幕录像 OBS
  20. 房子也许是租来的,但生活不是

热门文章

  1. Linux卸载MariaDB
  2. C/C++ 面试题记录
  3. 581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
  4. BZOJ2286 : [Sdoi2011]消耗战
  5. HttpModules 管道过滤 自定义页面
  6. poj 3009 Curling 2.0 (dfs的应用)
  7. 378. Kth Smallest Element in a Sorted Matrix
  8. [剑指offer][JAVA]面试题第[33]题[二叉搜索树的后序遍历][单调栈][递归分治]
  9. c语言分量的运算符,C语言基础(04-运算符和表达式)
  10. python做接口自动化测试仪器经销商_Python接口自动化测试的实现