c 基礎知識 特性

2021-08-15 01:06:43 字數 4236 閱讀 7753

特性(attribute)是用於在執行時傳遞程式中各種元素(比如類、方法、結構、列舉、元件等)的行為資訊的宣告性標籤。您可以通過使用特性向程式新增宣告性資訊。乙個宣告性標籤是通過放置在它所應用的元素前面的方括號([ ])來描述的。

特性(attribute)用於新增元資料,如編譯器指令和注釋、描述、方法、類等其他資訊。.net 框架提供了兩種型別的特性:預定義特性和自定義特性。

規定特性(attribute)的語法如下:

[attribute(positional_parameters, name_parameter = value, ...)]

element

特性(attribute)的名稱和值是在方括號內規定的,放置在它所應用的元素之前。positional_parameters 規定必需的資訊,name_parameter 規定可選的資訊。

.net 框架提供了三種預定義特性:

預定義特性attributeusage描述了如何使用乙個自定義特性類。它規定了特性可應用到的專案的型別。

規定該特性的語法如下:

[attributeusage(

validon,

allowmultiple=allowmultiple,

inherited=inherited

)]

其中:

例如:

[attributeusage(attributetargets.class |

attributetargets.constructor |

attributetargets.field |

attributetargets.method |

attributetargets.property,

allowmultiple = true)]

這個預定義特性標記了乙個條件方法,其執行依賴於指定的預處理識別符號。

它會引起方法呼叫的條件編譯,取決於指定的值,比如debugtrace。例如,當除錯**時顯示變數的值。

規定該特性的語法如下:

[conditional(

conditionalsymbol

)]

例如:

[conditional("debug")]
下面的例項演示了該特性:

#define debug

using system;

using system.diagnostics;

public class myclass

}class test

static void function2()

public static void main()

}

當上面的**被編譯和執行時,它會產生下列結果:

in main function

in function 1

in function 2

這個預定義特性標記了不應被使用的程式實體。它可以讓您通知編譯器丟棄某個特定的目標元素。例如,當乙個新方法被用在乙個類中,但是您仍然想要保持類中的舊方法,您可以通過顯示乙個應該使用新方法,而不是舊方法的訊息,來把它標記為 obsolete(過時的)。

規定該特性的語法如下:

[obsolete(

message

)][obsolete(

message,

iserror

)]

其中:

下面的例項演示了該特性:

using system;

public class myclass

static void newmethod()

public static void main()

}

當您嘗試編譯該程式時,編譯器會給出乙個錯誤訊息說明:

don't use oldmethod, use newmethod instead
.net 框架允許建立自定義特性,用於儲存宣告性的資訊,且可在執行時被檢索。該資訊根據設計標準和應用程式需要,可與任何目標元素相關。

建立並使用自定義特性包含四個步驟:

最後乙個步驟包含編寫乙個簡單的程式來讀取元資料以便查詢各種符號。元資料是用於描述其他資料的資料和資訊。該程式應使用反射來在執行時訪問特性。我們將在下一章詳細討論這點。

乙個新的自定義特性應派生自system.attribute類。例如:

// 乙個自定義特性 bugfix 被賦給類及其成員

[attributeusage(attributetargets.class |

attributetargets.constructor |

attributetargets.field |

attributetargets.method |

attributetargets.property,

allowmultiple = true)]

public class debuginfo : system.attribute

在上面的**中,我們已經宣告了乙個名為 debuginfo 的自定義特性。

讓我們構建乙個名為 debuginfo 的自定義特性,該特性將儲存除錯程式獲得的資訊。它儲存下面的資訊:

我們的 debuginfo 類將帶有三個用於儲存前三個資訊的私有屬性(property)和乙個用於儲存訊息的公有屬性(property)。所以 bug 編號、開發人員名字和審查日期將是 debuginfo 類的必需的定位( positional)引數,訊息將是乙個可選的命名(named)引數。

每個特性必須至少有乙個建構函式。必需的定位( positional)引數應通過建構函式傳遞。下面的**演示了 debuginfo 類:

// 乙個自定義特性 bugfix 被賦給類及其成員

[attributeusage(attributetargets.class |

attributetargets.constructor |

attributetargets.field |

attributetargets.method |

attributetargets.property,

allowmultiple = true)]

public class debuginfo : system.attribute

public int bugno

}public string developer

}public string lastreview

}public string message

set}}

通過把特性放置在緊接著它的目標之前,來應用該特性:

[debuginfo(45, "zara ali", "12/8/2012", message = "return type mismatch")]

[debuginfo(49, "nuha ali", "10/10/2012", message = "unused variable")]

class rectangle

[debuginfo(55, "zara ali", "19/10/2012",

message = "return type mismatch")]

public double getarea()

[debuginfo(56, "zara ali", "19/10/2012")]

public void display()

", length);

console.writeline("width: ", width);

console.writeline("area: ", getarea());

}

筆記:c# 中利用 conditional 定義條件方法:

利用 conditional 屬性,程式設計師可以定義條件方法。conditional 屬性通過測試條件編譯符號來確定適用的條件。當執行到乙個條件方法呼叫時,是否執行該呼叫,要根據出現該呼叫時是否已定義了此符號來確定。如果定義了此符號,則執行該呼叫;否則省略該呼叫(包括對呼叫的引數的計算)。使用conditional是封閉#if和#endif內部方法的替代方法,它更整潔,更別緻、減少了出錯的機會。

條件方法要受到以下限制:

這裡需要注意的是:如果建立乙個沒有定義任何條件的方法,那麼預設只要呼叫就總是會執行此方法,如果你想通過條件來判斷執行,那麼該方法上必須至少包含乙個conditional特性所定義的條件,它才會響應你定義的條件。

C 基礎知識

抽象類 abstract class 一種不可以被例項化的類。抽象類中一般含有抽象方法,當然也可有具體實現。繼承類只有實現過所有抽象類的抽象方法後才能被例項化。介面 inte ce 只含有共有抽象方法 public abstract method 的類。這些方法必須在子類中被實現。反射 程式集包含模...

c 基礎知識

或運算的意義是什麼 0 0 0 0 1 1 1 0 1 1 1 1 無進製與運算的意義是什麼 在vc中,視窗的每個屬性對應乙個只有一位為1的16位的二進位制數,當增加某屬性做或運算 即可,取消某個屬性只需與 上這個屬性的取反。cs.style ws maximizebox 和cs.style cs....

C 基礎知識

1 malloc和new區別與聯絡 a malloc malloc為函式,需要標頭檔案,申請的無型別,需要強制轉換 free釋放。示例 char p char malloc 10 sizeof char free p b new new是運算子,不需要標頭檔案,申請的是有型別的,自動呼叫建構函式 d...