惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
Martin Fowler
Martin Fowler
罗磊的独立博客
The GitHub Blog
The GitHub Blog
L
LangChain Blog
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
DataBreaches.Net
宝玉的分享
宝玉的分享
U
Unit 42
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
N
Netflix TechBlog - Medium
The Cloudflare Blog
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
美团技术团队
大猫的无限游戏
大猫的无限游戏
雷峰网
雷峰网
爱范儿
爱范儿
酷 壳 – CoolShell
酷 壳 – CoolShell
MongoDB | Blog
MongoDB | Blog

博客园 - Anytao

[视频],花一分钟来看看Worktile是如何为团队协作而生的 如何使用Worktile进行敏捷项目开发管理 有一个团队协同工具,叫Worktile 上博客园,用工作台 [WP7], #01, Windows Phone 7培训点滴 [推荐], 开始Azure之旅,参加深度培训 [推荐],与创业公司一起成长 [开发故事],第十五回,在Js中应用命名空间 [推荐], 游戏?地图?还是交友?尽在16fun 2010,因为不同:挺进2010,记忆2009 [你必须知道的.NET]第三十五回,判断dll是debug还是release,这是个问题 [关注]日益火爆的Social media - Anytao - 博客园 [开发故事]第五回,用想要的域名运行你的本地Web应用 [你必须知道的.NET]第三十三回,深入.NET 4.0之,Lazy<T>点滴 [活动]博文视点Open Party上海站职业生涯分论坛 哥写的不是代码,是寂寞 [一些思考]转身,关注更高。 [书评杂谈]观止,观而不止 [书评杂谈]《我也能做CTO》 书评
[你必须知道的.NET]第三十四回,object成员,不见了!
Anytao · 2009-10-30 · via 博客园 - Anytao

anytao.net | 《你必须知道的.NET》网站 | Anytao技术博客 

发布日期:2009.10.30 作者:Anytao
© 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处。

在.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成员。

o_anytao-insidenet-34-01[1]

哈哈!清新多了吧,比起下面常见的编码方式:

o_anytao-insidenet-34-02[1]

是不是让人不知所挫。大概说来,任何时候,在长长的成员方法列表中,你总能看到他们的身影,谁让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并不对同一程序集的成员有效。

还等什么?也去试试吧?另外关于编辑器,还有很多好玩的特性值得挖掘,贵在发现的力量。

参考文献

更多闲言碎语,关注anytao.net