程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> [你必須知道的.NET]第三十四回,object成員,不見了!

[你必須知道的.NET]第三十四回,object成員,不見了!

編輯:關於.NET

在.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並不對同一程序集的成員有效。

還等什麼?也去試試吧?另外關於編輯器,還有很多好玩的特性值得挖掘,貴在發現的力量。

文章來源:http://anytao.cnblogs.com/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved