c#特性(attribute)
.net框架提供了三種預定義特性:attributeusage、conditional、obsolete
預定義特性attributeusage:預定義特性attributeusage描述了如何使用乙個自定義特性類,它規定了特性可應用到的專案的型別。
[attributeusage(
validon,
allowmultiple=allowmultiple,
inherited=inherited)}
conditional
這個預定義特性標記了乙個條件方法,其執行依賴於指定的預處理識別符號。它會引起方法呼叫的條件編譯,取決於指定的值,比如debug或trace.例如,當除錯**時顯示變數的值。
規定該特性的語法如下:
[obsoleteconditional
(conditionalsymbol
)]例如:
[conditional
("debug"
)]
這個預定義特性標記了不應被使用的程式實體。它可以讓您通知編譯器丟棄某個特定的目標元素。例如,當乙個新方法被用在乙個類中,但是您仍然想要保持類中的舊方法,您可以通過顯示乙個應該使用新方法,而不是舊方法的訊息,來把它標記為 obsolete(過時的)。
[obsolete(
message
)][obsolete(
message,
iserror
)]
引數message,是乙個字串,描述專案為什麼過時的原因以及該替代是用什麼。
引數iserror,是乙個布林值。如果該值為true,編譯器應把該項目的使用當做乙個錯誤,預設值的false(編譯器生成乙個警告)。
建立自定義特性(attribute)
.net框架允許建立自定義特性,用於儲存宣告性資訊,且可在執行時被檢索,該資訊根據設計標準和程式需要,可與任何目標元素相關。
建立並使用自定義特性包含四個步驟:
宣告自定義特性。構建自定義特性、在目標程式元素上應用自定義特性、通過反射訪問自定義特性。
宣告自定義特性:
乙個新的自定義特性應派生自system.attribute類。例如:
// 乙個自定義特性 bugfix 被賦給類及其成員
[attributeusage(attributetargets.class |
attributetargets.constructor |
attributetargets.field |
attributetargets.method |
attributetargets.property,
allowmultiple = true)]
public class debuginfo : system.attribute
構建自定義
// 乙個自定義特性 bugfix 被賦給類及其成員c#中利用conditional定義條件方法[attributeusage
(attributetargets
.class
|attributetargets
.constructor
|attributetargets
.field
|attributetargets
.method
|attributetargets
.property
,allowmultiple
=true
)]public
class
debuginfo
:system
.attribute
public
intbugno
}public
string
developer
}public
string
lastreview
}public
string
message
set}
}
利用conditional屬性,程式設計師可以定義條件方法。conditional屬性通過測試條件編譯符號來確定適用的條件。當執行到乙個條件方法呼叫時,是否執行該呼叫,要根據出現該呼叫時是否已定義了此符號來確定。如果定義了此符號,則執行該呼叫;否則省略該呼叫(包括對呼叫的引數的計算)。使用conditional是封閉#if和#endif內部方法的替代方法,它更整潔、更別緻、減少了出錯的機會。
條件方法要受到以下限制:
條件方法必須是類宣告或結構宣告中的方法。如果在介面宣告中的方法指定conditional屬性,將出現編譯時錯誤。
條件方法必須具有返回型別。
不能用override修飾符標記條件方法。但是可以用virtual修飾符標記條件方法。此類方法的重寫方法隱含為有條件的方法,而且不能用conditional屬性顯式標記。
條件方法不能是介面方法的實現。否則將發生編譯時錯誤。
如果條件方法用在委託建立表示式中,也會發生編譯時錯誤。
這裡需要注意的是:如果建立乙個沒有定義任何條件的方法,那麼預設只要呼叫就總是會執行此方法,如果你想通過條件判斷來執行,那麼該方法上必須至少包含乙個conditional特性所包含的條件,他才會響應你定義的條件。
c 菜鳥教程
菜鳥教程中的c 1.c 類訪問修飾符 public,private 只有類和友元函式可以訪問 protected 保護成員變數與私有成員十分相似,不同的是保護成員可以在派生類中訪問 在類裡不寫訪問修飾符,預設是private,但是結構體的預設是public 2.虛繼承 需要理解原理 是解決c 多重繼...
C 菜鳥教程
菜鳥教程c 全域性變數和和區域性變數同名時,可通過網域名稱在函式中引用到全域性變數,不加網域名稱解析則引用區域性變數 include using namespace std int a 10 intmain lambda 函式與表示式 c 11 提供了對匿名函式的支援,稱為 lambda 函式 也叫...
菜鳥教程C 高階教程部分理解(一)委託與事件
委託 delegate 所有的委託 delegate 都派生自 system.delegate 類。定義乙個委託,該委託可用於引用帶有完全相同引數和返回型別的方法。事件 event 第乙個地方 事件發布 可以在乙個類中通過委託規定有乙個函式,它的函式名 引數 返回值都定好了,但沒有實現。基於上面的委...