[你必須知道的.NET】object成員,不見了!

作者: Anytao  來源: 博客園  發布時間: 2009-10-30 10:46  閱讀: 3228 次  推薦: 0   原文鏈接   [收藏]  

  在.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
{
    /// 
    /// A common interface for any object
    /// 
    [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

anytao | © 2009 Anytao.com

2009/10/30 | http://anytao.cnblogs.com/ | http://www.anytao.net/blog/post/2009/10/29/anytao-insidenet-34-object-members-hide.aspx

  本文以“現狀”提供且沒有任何擔保,同時也沒有授予任何權利。 | This posting is provided "AS IS" with no warranties, and confers no rights.

  本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

0
0
 
標簽:ASP.NET c# object
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()