C 中一些預設的預定義屬性

2021-04-14 07:16:13 字數 4139 閱讀 2721

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屬性將程式的預設執行緒模型指定為單執行緒模型。注意,執行緒模型只影響使用com interop的應用程式,將這個屬性應用於不使用com interop的程式將不會產生任何效果。

2. attributeusage屬性

除了用於標註常規c#型別的自定義屬性以外,還可以使用attributeusage屬性定義你使用這些屬性的方式。檔案記錄的attributeusage屬性呼叫用法如下:

[attributeusage( validon , allowmutiple = allowmutiple , inherited = inherited )]

validon引數是attributetargets型別的,這個列舉值的定義如下:

public enum attributetargets

allowmultiple決定了可以在單個欄位上使用某個屬性多少次,在預設情況下,所有的屬性都是單次使用的。示例如下:

[attributeusage( attributetargets.all , allowmultiple = true )]

public class somethingattribute : attribute }

//如果allowmultiple = false , 此處會報錯

[something(「abc」)]

[something(「def」)]

class myclass

inherited引數是繼承的標誌,它指出屬性是否可以被繼承。預設是false。

inherited allowmultiple 結果

true false 派生的屬性覆蓋基屬性

true false 派生的屬性和基屬性共存

**示例:

using system;

using system.reflection;

namespace attribinheritance

set

} public somethingattribute(string str) }

[something("abc")]

class myclass

[something("def")]

class another : myclass

class test

", sa.name);

} }

} }

} 當allowmultiple被設定為false時,結果為:

custom attribute : def

當allowmultiple被設定為true時,結果為:

custom attribute : def

custom attribute : abc

注意,如果將false傳遞給getcustomattributes,它不會搜尋繼承樹,所以你只能得到派生的類屬性。

3.conditional 屬性

你可以將這個屬性附著於方法,這樣當編譯器遇到對這個方法呼叫時,如果沒有定義對應的字串值,編譯器就忽略這個呼叫。例如,以下方法是否被編譯取決於是否定義了字串「degug」:

using system;

using system.diagnostics;

namespace condattrib

public void somefunc()

[conditional("debug")]

[conditional("andrew")]

public void somedebugfunc() }

public class class1 }

} 4. obsolete 屬性

隨著**不斷的發展,你很可以會有一些方法不用。可以將它們都刪除,但是有時給它們加上適當的標註比刪除它們更合適,例如:

using system;

namespace obsattrib

public void newfunc( )

} class class1 }

} 我們將obsolete屬性的第二個引數設定為true,當呼叫時函式時編譯器會產生乙個錯誤。

e:/insidec#/code/chap06/obsattrib/obsattrib/class1.cs(20): 'obsattrib.someclass.oldfunc()' 已過時: 'don't use oldfunc, use newfunc instead'

5. dllimport和structlayout屬性

dllimport可以讓c#**呼叫本機**中的函式,c#**通過平台呼叫(platform invoke)這個執行時功能呼叫它們。

如果你希望執行時環境將結構從託管**正確地編組現非託管**(或相反),那麼需要為結構的宣告附加屬性。為了使結構引數可以被正確的編組,必須使用 structlayout屬性宣告它們,指出資料應該嚴格地按照宣告中列出的樣子進行布局。如果不這麼做,資料將不能正確地被編組,而應用程式可能會出 錯。

using system;

using system.runtime.interopservices;    // for dllimport

namespace nativedll

[dllimport ("kernel32.dll")]

public static extern void getlocaltime(systemtime st);

[stathread]

public static void main(string args)

--",

st.wmonth, st.wday, st.wyear);

string t = string.format("time: ::",

st.whour, st.wminute, st.wsecond);

string u = s + ", " + t;

messageboxa(0, u, "now", 0);

} }

} 6. 配件屬性

當使用.net產生任何型別的c#工程時,會自動的產生乙個assemblyinfo.cs源**檔案以及應用程式源**檔案。 assemblyinfo.cs中含有配件中**的資訊。其中的一些資訊純粹是資訊,而其它資訊使執行時環境可以確保惟一的命名和版本號,以供重用你的配 件的客戶**使用。

7. 上下文屬性

.net櫃架還提供了另一種屬性:上下文屬性。上下文屬性提供了一種擷取機制,可以在類的例項化和方法呼叫之前和之後進行處理。這種功能用於物件遠端調 用,它是從基於com的系統所用的com+元件服務和microsoft transaction services(mts)。 

gmapping 中一些關鍵定義

所有粒子的濾波結構體陣列 typedef std vectorparticlevector particlevector m particles 粒子濾波器中的粒子結構體 每個粒子有自己的地圖 位姿 權重 軌跡 軌跡是按照時間順序排列的,葉子節點表示最近的節點 struct particle inl...

js,css中一些尺寸屬性詳解

width 目標元素的寬度 height 目標元素的高度 innerwidth 目標元素加padding之後的寬度,相當於clientwidth innerheight 目標元素的padding之後的高度,相當於clientheight outerwidth 目標元素寬度加padding,borde...

C 中一些格式的轉換

1 datetime 數字型 system.datetime currenttime new system.datetime 1.1 取當前年月日時分秒 currenttime system.datetime.now 1.2 取當前年 int 年 currenttime.year 1.3 取當前月 ...