程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中一些默認的預定義屬性

C#中一些默認的預定義屬性

編輯:C#入門知識

C#中一些默認的預定義屬性,見下表:

預定義的屬性 有效目標 說明
AttributeUsage Class 指定另一個屬性類的有效使用方式
CLSCompliant 全部 指出程序元素是否與CLS兼容
Conditional Method 指出如果沒有定義相關聯的字符串,編譯器就可以忽略對這個方法的任何調用
DllImport Method 指定包含外部方法的實現的DLL位置
STAThread Method(Main) 指出程序的默認線程模型為STA
MTAThread Method(Main) 指出程序的默認模型為多線程(MTA)
Obsolete 除了Assembly、Module、Parameter和Return 將一個元素標示為不可用,通知用戶此元素將被從未來的產品
ParamArray Parameter 允許單個參數被隱式地當作params(數組)參數對待
Serializable Class、Struct、enum、delegate 指定這種類型的所有公共和私有字段可以被串行化
NonSerialized Field 應用於被標示為可串行化的類的字段,指出這些字段將不可被串行化
StructLayout Class、struct 指定類或結構的數據布局的性質,比如Auto、Explicit或sequential
ThreadStatic Field(靜態) 實現線程局部存儲(TLS)。不能跨多個線程共享給定的靜態字段,每個線程擁有這個靜態字段的副本

下面介紹幾種常用的屬性
1.[STAThread]和[MTAThread]屬性
class Class1
{
       [STAThread]
       Static void Main( string[] args )
       {
       }
}
使用STAThread屬性將程序的默認線程模型指定為單線程模型。注意,線程模型只影響使用COM interop的應用程序,將這個屬性應用於不使用COM interop的程序將不會產生任何效果。
2. AttributeUsage屬性
       除了用於標注常規C#類型的自定義屬性以外,還可以使用AttributeUsage屬性定義你使用這些屬性的方式。文件記錄的AttributeUsage屬性調用用法如下:
[AttributeUsage( validon , AllowMutiple = allowmutiple , Inherited = inherited )]
Validon參數是AttributeTargets類型的,這個枚舉值的定義如下:
public enum AttributeTargets
{
       Assembly = 0x0001,
       Module = 0x0002,
       Class = 0x0004,
       Struct = 0x0008,
       Enum = 0x0010,
       Constructor = 0x0020,
       Method = 0x0040,
       Property = 0x0080,
       Field = 0x0100,
       Event = 0x200,
       Interface = 0x400,
       Parameter = 0x800,
       Delegate = 0x1000,
       All = Assembly | Module | Class | Struct | Enum | Constructor| Method | Property|                    Filed| Event| Interface | Parameter | Deleagte ,
       ClassMembers = | Class | Struct | Enum | Constructor | Method | Property | Field |                    Event | Delegate | Interface
}
AllowMultiple決定了可以在單個字段上使用某個屬性多少次,在默認情況下,所有的屬性都是單次使用的。示例如下:
[AttributeUsage( AttributeTargets.All , AllowMultiple = true )]
public class SomethingAttribute : Attribute
{
       public SomethingAttribute( string str )
       {
       }
}
//如果AllowMultiple = false , 此處會報錯
[Something(“abc”)]
[Something(“def”)]
class Myclass
{
}
Inherited參數是繼承的標志,它指出屬性是否可以被繼承。默認是false。
Inherited AllowMultiple 結果
true false 派生的屬性覆蓋基屬性
true false 派生的屬性和基屬性共存
代碼示例:
using System;
using System.Reflection;

namespace AttribInheritance
{
    [AttributeUsage(
         AttributeTargets.All,
         AllowMultiple=true,
//       AllowMultiple=false,
         Inherited=true
    )]
    public class SomethingAttribute : Attribute
    {
        private string name;
        public string Name
        {
             get { return name; }
             set { name = value; }
        }

        public SomethingAttribute(string str)
        {
             this.name = str;
        }
    }
       
    [Something("abc")]
    class MyClass
    {
    }

    [Something("def")]
    class Another : MyClass
    {
    }
       
    class Test
    {
        [STAThread]
        static void Main(string[] args)
        {
             Type type =
                 Type.GetType("AttribInheritance.Another");
             foreach (Attribute attr in
                 type.GetCustomAttributes(true))
//                type.GetCustomAttributes(false))
             {
                 SomethingAttribute sa =
                      attr as SomethingAttribute;
                 if (null != sa)
                 {
                 Console.WriteLine(
                          "Custom Attribute: {0}",
                          sa.Name);
                 }
             }

        }
    }
}
當AllowMultiple被設置為false時,結果為:
Custom Attribute : def
當AllowMultiple被設置為true時,結果為:
Custom Attribute : def
Custom Attribute : abc
注意,如果將false傳遞給GetCustomAttributes,它不會搜索繼承樹,所以你只能得到派生的類屬性。

3.Conditional 屬性
       你可以將這個屬性附著於方法,這樣當編譯器遇到對這個方法調用時,如果沒有定義對應的字符串值,編譯器就忽略這個調用。例如,以下方法是否被編譯取決於是否定義了字符串“DEGUG”:
[Condition(“DEBUG”) ]
public void SomeDebugFunc()
{
       Console.WriteLine(“SomeDebugFunc”);
}
using System;
using System.Diagnostics;

namespace CondAttrib
{
    class Thing

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