zoukankan      html  css  js  c++  java
  • 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成员。

    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

    参考 :http://www.cnblogs.com/anytao/archive/2009/10/30/must_net_34.html

  • 相关阅读:
    MQTT TLS 加密传输
    python多进程并发redis
    各种消息队列的特点
    mqtt异步publish方法
    Numpy API Analysis
    Karma install steps for unit test of Angular JS app
    reinstall bower command
    Simulate getter in JavaScript by valueOf and toString method
    How to: Raise and Consume Events
    获取对象的类型信息 (JavaScript)
  • 原文地址:https://www.cnblogs.com/luckjason/p/2521524.html
Copyright © 2011-2022 走看看