国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

屬性和元數據 -- zt

2024-07-21 02:28:00
字體:
來源:轉載
供稿:網友
注冊會員,創建你的web開發資料庫,屬性和元數據  


c#和c++之間一個顯著的區別是它提供了對元數據的支持:有關類、對象、方法等其他實體的數據。屬性可以分為二類:一類以clr的一部分的形式出現,另一種是我們自己創建的屬性,clr屬性用來支持串行化、排列和com協同性等。一些屬性是針對一個組合體的,有些屬性則是針對類或界面,它們也被稱作是屬性目標。  

將屬性放在屬性目標前的方括號內,屬性就可以作用于它們的屬性目標。  

[assembly:assemblydelaysign(false)]
[assembly:assemblykeyfile(".//keyfile.snk")]  

或用逗號將各個屬性分開:  

[assembly:assemblydelaysign(false),
assembly:assemblykeyfile(".//keyfile.snk")]  



自定義的屬性  


我們可以任意創建自定義屬性,并在認為合適的時候使用它們。假設我們需要跟蹤bug的修復情況,就需要建立一個包含bug的數據庫,但需要將bug報告與專門的修正情況綁定在一塊兒,則可能在代碼中添加如下所示的注釋:  

//bug323fixedbyjesseliberty1/1/2005.  

這樣,在源代碼中就可以一目了然地了解bug的修正情況,但如果如果把相關的資料保存在數據庫中可能會更好,這樣就更方便我們的查詢工作了。如果所有的bug報告都使用相同的語法那就更好了,但這時我們就需要一個定制的屬性了。我們可能使用下面的內容代替代碼中的注釋:  

[bugfix(323,"jesseliberty","1/1/2005")comment="offbyoneerror"]  

與c#中的其他元素一樣,屬性也是類。定制化的屬性類需要繼承system.attribute:  

publicclassbugfixattribute:system.attribute  

我們需要讓編譯器知道這個屬性可以跟什么類型的元素,我們可以通過如下的方式來指定該類型的元素:  

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

attributeusage是一個作用于屬性的屬性━━元屬性,它提供的是元數據的元數據,也即有關元數據的數據。在這種情況下,我們需要傳遞二個參數,第一個是目標(在本例中是類成員。),第二個是表示一個給定的元素是否可以接受多于一個屬性的標記。allowmultiple的值被設置為true,意味著類成員可以有多于一個bugfixattribute屬性。如果要聯合二個屬性目標,可以使用or操作符連接它們。  

[attributeusage(attributetargets.class|attributetargets.interface,allowmultiple=true)]  

上面的代碼將使一個屬性隸屬于一個類或一個界面。  

新的自定義屬性被命名為bugfixattribute。命名的規則是在屬性名之后添加attribute。在將屬性指派給一個元素后,編譯器允許我們使用精簡的屬性名調用這一屬性。因此,下面的代碼是合法的:  

[bugfix(123,"jesseliberty","01/01/05",comment="offbyone")]  

編譯器將首先查找名字為bugfix的屬性,如果沒有發現,則查找bugfixattribute。  

每個屬性必須至少有一個構造器。屬性可以接受二種類型的參數:環境參數和命名參數。在前面的例子中,bugid、編程人員的名字和日期是環境參數,注釋是命名參數。環境參數被傳遞到構造器中的,而且必須按在構造器中定義的順序傳遞。  

publicbugfixattribute(intbugid,stringprogrammer,stringdate)
{
this.bugid=bugid;
this.programmer=programmer;
this.date=date;
}

namedparametersareimplementedasproperties.  



屬性的使用  


為了對屬性進行測試,我們創建一個名字為mymath的簡單類,并給它添加二個函數,然后給它指定bugfix屬性。  

[bugfixattribute(121,"jesseliberty","01/03/05")]

[bugfixattribute(107,"jesseliberty","01/04/05",
comment="fixedoffbyoneerrors")]
publicclassmymath

  

這些數據將與元數據存儲在一起。下面是完整的源代碼及其輸出:  



自定義屬性  

usingsystem;
//創建被指派給類成員的自定義屬性
[attributeusage(attributetargets.class,
allowmultiple=true)]
publicclassbugfixattribute:system.attribute
{
//位置參數的自定義屬性構造器
publicbugfixattribute
(intbugid,
stringprogrammer,
stringdate)
{
this.bugid=bugid;
this.programmer=programmer;
this.date=date;
}
publicintbugid
{
get
{
returnbugid;
}
}

//命名參數的屬性
publicstringcomment
{
get
{
returncomment;
}
set
{
comment=value;
}
}

publicstringdate
{
get
{
returndate;
}
}

publicstringprogrammer
{
get
{
returnprogrammer;
}
}

//專有成員數據
privateintbugid;
privatestringcomment;
privatestringdate;
privatestringprogrammer;
}

//把屬性指派給類

[bugfixattribute(121,"jesseliberty","01/03/05")]
[bugfixattribute(107,"jesseliberty","01/04/05",
comment="fixedoffbyoneerrors")]
publicclassmymath
{

publicdoubledofunc1(doubleparam1)
{
returnparam1+dofunc2(param1);
}

publicdoubledofunc2(doubleparam1)
{
returnparam1/3;
}

}

publicclasstester
{
publicstaticvoidmain()
{
mymathmm=newmymath();
console.writeline("callingdofunc(7).result:{0}",
mm.dofunc1(7));
}
}

  

輸出:  

callingdofunc(7).result:9.3333333333333339  

象我們看到的那樣,屬性對輸出絕對沒有影響,創建屬性也不會影響代碼的性能。到目前為止,讀者也只是在聽我論述有關屬性的問題,使用ildasm瀏覽元數據,就會發現屬性確實是存在的。  



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 屏南县| 皮山县| 碌曲县| 崇阳县| 临江市| 嫩江县| 扬中市| 花莲市| 靖宇县| 汶上县| 福海县| 望江县| 丰都县| 定兴县| 三门峡市| 临沧市| 铜陵市| 祁阳县| 射洪县| 梧州市| 沅陵县| 乌拉特前旗| 葫芦岛市| 龙口市| 奈曼旗| 灵武市| 龙陵县| 新安县| 淮滨县| 灌南县| 和静县| 阳新县| 天水市| 大竹县| 会理县| 板桥市| 咸阳市| 正安县| 武定县| 福泉市| 信丰县|