属性Attributes

C# 言語の多くは、プログラマは、プログラムで定義されたエンティティの宣言型の情報を指定できます。Much of the C# language enables the programmer to specify declarative information about the entities defined in the program. 修飾して、クラスのメソッドのアクセシビリティを指定するなど、 method_modifiers publicprotectedinternal、およびprivateします。For example, the accessibility of a method in a class is specified by decorating it with the method_modifiers public, protected, internal, and private.

C# では、新しい種類の宣言型の情報を作成属性します。C# enables programmers to invent new kinds of declarative information, called attributes. プログラマは、さまざまなプログラム エンティティに属性を追加し、実行時環境での属性情報を取得します。Programmers can then attach attributes to various program entities, and retrieve attribute information in a run-time environment. たとえば、フレームワークは、定義、HelpAttribute属性にこれらのプログラム要素からそのドキュメントへのマッピングを提供する (クラスとメソッド) などの特定のプログラム要素に配置できます。For instance, a framework might define a HelpAttribute attribute that can be placed on certain program elements (such as classes and methods) to provide a mapping from those program elements to their documentation.

属性は属性クラスの宣言によって定義されます (属性クラス)、位置指定引数と名前付きパラメーターである可能性があります (位置指定パラメーターと名前付きパラメーター)。Attributes are defined through the declaration of attribute classes (Attribute classes), which may have positional and named parameters (Positional and named parameters). 属性の仕様を使用して c# プログラム内のエンティティに関連付けられている属性 (属性の指定)、属性のインスタンスとして実行時に取得することができます (属性インスタンス)。Attributes are attached to entities in a C# program using attribute specifications (Attribute specification), and can be retrieved at run-time as attribute instances (Attribute instances).

属性クラスAttribute classes

抽象クラスから派生するクラスをSystem.Attribute、直接的または間接的にするかどうかは、属性クラスします。A class that derives from the abstract class System.Attribute, whether directly or indirectly, is an attribute class. 属性クラスの宣言定義の種類を新しい属性宣言でに配置することができます。The declaration of an attribute class defines a new kind of attribute that can be placed on a declaration. サフィックスを持つ属性クラスの名前は慣例により、Attributeします。By convention, attribute classes are named with a suffix of Attribute. 属性の使用は可能性があります含めるか、このサフィックスを省略します。Uses of an attribute may either include or omit this suffix.

属性の使用方法Attribute usage

属性AttributeUsage(、AttributeUsage 属性) 属性クラスの使用方法について説明するために使用します。The attribute AttributeUsage (The AttributeUsage attribute) is used to describe how an attribute class can be used.

AttributeUsage 位置指定パラメーターがあります (位置指定パラメーターと名前付きパラメーター) 宣言を使用できますの種類を指定する属性クラスを有効にします。AttributeUsage has a positional parameter (Positional and named parameters) that enables an attribute class to specify the kinds of declarations on which it can be used. 例では、The example

using System;

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface)]
public class SimpleAttribute: Attribute 
{
    ...
}

という名前の属性クラスを定義しますSimpleAttribute上に配置するclass_declarations とinterface_declarationにのみです。defines an attribute class named SimpleAttribute that can be placed on class_declarations and interface_declarations only. 例では、The example

[Simple] class Class1 {...}

[Simple] interface Interface1 {...}

いくつか示されて、Simple属性。shows several uses of the Simple attribute. この属性は名前で定義されてSimpleAttribute、この属性を使用する場合、Attributeサフィックスは省略できます。 その結果、短い名前Simpleします。Although this attribute is defined with the name SimpleAttribute, when this attribute is used, the Attribute suffix may be omitted, resulting in the short name Simple. したがって、上記の例は、次の意味と同等です。Thus, the example above is semantically equivalent to the following:

[SimpleAttribute] class Class1 {...}

[SimpleAttribute] interface Interface1 {...}

AttributeUsage 名前付きパラメーターがあります (位置指定パラメーターと名前付きパラメーター) と呼ばれるAllowMultiple、特定のエンティティの属性を複数回指定できるかどうかを示します。AttributeUsage has a named parameter (Positional and named parameters) called AllowMultiple, which indicates whether the attribute can be specified more than once for a given entity. 場合AllowMultiple属性クラスが true の場合は、その属性クラス、属性を複数使用クラスエンティティで複数回指定できます。If AllowMultiple for an attribute class is true, then that attribute class is a multi-use attribute class, and can be specified more than once on an entity. 場合AllowMultiple属性クラスは常に false かは指定しませんし、その属性クラスは、単一使用属性クラスエンティティに最大で 1 回指定できます。If AllowMultiple for an attribute class is false or it is unspecified, then that attribute class is a single-use attribute class, and can be specified at most once on an entity.

例では、The example

using System;

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class AuthorAttribute: Attribute
{
    private string name;

    public AuthorAttribute(string name) {
        this.name = name;
    }

    public string Name {
        get { return name; }
    }
}

という名前の属性を複数使用クラスを定義します。AuthorAttributeします。defines a multi-use attribute class named AuthorAttribute. 例では、The example

[Author("Brian Kernighan"), Author("Dennis Ritchie")] 
class Class1
{
    ...
}

2 つの用途をクラス宣言を示しています、Author属性。shows a class declaration with two uses of the Author attribute.

AttributeUsage 呼ばれる別の名前付きパラメーターを持つInherited、基底クラスで指定する場合は、属性がその基底クラスから派生したクラスによって継承もかどうかを示します。AttributeUsage has another named parameter called Inherited, which indicates whether the attribute, when specified on a base class, is also inherited by classes that derive from that base class. 場合Inherited属性クラスが true の場合、その属性が継承されます。If Inherited for an attribute class is true, then that attribute is inherited. 場合Inherited属性クラスは常に false し、その属性は継承されません。If Inherited for an attribute class is false then that attribute is not inherited. 指定されていない場合、既定値は true です。If it is unspecified, its default value is true.

属性クラスXがない、AttributeUsageように、属性がアタッチされています。An attribute class X not having an AttributeUsage attribute attached to it, as in

using System;

class X: Attribute {...}

次のと同等です。is equivalent to the following:

using System;

[AttributeUsage(
    AttributeTargets.All,
    AllowMultiple = false,
    Inherited = true)
]
class X: Attribute {...}

位置指定引数と名前付きパラメーターPositional and named parameters

属性クラスが持つことができます位置指定パラメーター名前付きパラメーターします。Attribute classes can have positional parameters and named parameters. 属性クラスの各パブリック インスタンス コンス トラクターは、その属性クラスの位置指定パラメーターの有効なシーケンスを定義します。Each public instance constructor for an attribute class defines a valid sequence of positional parameters for that attribute class. 各静的でないパブリックの読み取り/書き込みフィールドと、属性クラスのプロパティは、属性クラスの名前付きパラメーターを定義します。Each non-static public read-write field and property for an attribute class defines a named parameter for the attribute class.

例では、The example

using System;

[AttributeUsage(AttributeTargets.Class)]
public class HelpAttribute: Attribute
{
    public HelpAttribute(string url) {        // Positional parameter
        ...
    }

    public string Topic {                     // Named parameter
        get {...}
        set {...}
    }

    public string Url {
        get {...}
    }
}

という名前の属性クラスを定義しますHelpAttribute1 つの位置指定パラメーターを持つurlと 1 つの名前付きパラメーターTopicします。defines an attribute class named HelpAttribute that has one positional parameter, url, and one named parameter, Topic. Non-static および public プロパティがUrl読み取り/書き込みではないために、名前付きのパラメーターを定義しません。Although it is non-static and public, the property Url does not define a named parameter, since it is not read-write.

この属性クラスを次のように使用する可能性があります。This attribute class might be used as follows:

[Help("http://www.mycompany.com/.../Class1.htm")]
class Class1
{
    ...
}

[Help("http://www.mycompany.com/.../Misc.htm", Topic = "Class2")]
class Class2
{
    ...
}

属性パラメーターの型Attribute parameter types

属性クラスの位置と名前付きパラメーターの型に制限されます、属性パラメーター型は。The types of positional and named parameters for an attribute class are limited to the attribute parameter types, which are:

  • 次の種類のいずれか: boolbytechardoublefloatintlongsbyteshortstringuintulongushort.One of the following types: bool, byte, char, double, float, int, long, sbyte, short, string, uint, ulong, ushort.
  • objectThe type object.
  • System.TypeThe type System.Type.
  • パブリック アクセシビリティし、では、入れ子になっている (該当する場合) の型もパブリック アクセシビリティを持つ列挙型が提供される (属性の指定)。An enum type, provided it has public accessibility and the types in which it is nested (if any) also have public accessibility (Attribute specification).
  • 上記の種類の 1 次元配列。Single-dimensional arrays of the above types.
  • コンス トラクター引数またはこれらの型の 1 つがパブリック フィールドは、属性の指定で位置指定か名前付きパラメーターとして使用できません。A constructor argument or public field which does not have one of these types, cannot be used as a positional or named parameter in an attribute specification.

属性の指定Attribute specification

属性の指定はアプリケーションを以前に定義された属性の宣言。Attribute specification is the application of a previously defined attribute to a declaration. 属性は、宣言で指定されている追加の宣言情報です。An attribute is a piece of additional declarative information that is specified for a declaration. 属性は、グローバル スコープ (を含んでいるアセンブリまたはモジュールに属性を指定) に指定することができます、 type_declarations (入力宣言)、 class_member_declarations (パラメーターの制約入力)、 interface_member_declarations (インターフェイスのメンバー)、 struct_member_declarations (構造体のメンバー)、 enum_member_declarations (列挙型メンバー)、 accessor_declarations (アクセサー)、 event_accessor_declarations (フィールドのようなイベント)、およびformal_parameter_lists (メソッド パラメーター)。Attributes can be specified at global scope (to specify attributes on the containing assembly or module) and for type_declarations (Type declarations), class_member_declarations (Type parameter constraints), interface_member_declarations (Interface members), struct_member_declarations (Struct members), enum_member_declarations (Enum members), accessor_declarations (Accessors), event_accessor_declarations (Field-like events), and formal_parameter_lists (Method parameters).

属性で指定属性セクションします。Attributes are specified in attribute sections. 属性のセクションでは、1 つまたは複数の属性のコンマ区切りのリストを囲む角かっこのペアで構成されます。An attribute section consists of a pair of square brackets, which surround a comma-separated list of one or more attributes. 属性は、このようなリストで指定し、同じプログラム エンティティにアタッチされているセクションでは、順序の配置の順序は大きくありません。The order in which attributes are specified in such a list, and the order in which sections attached to the same program entity are arranged, is not significant. 属性の指定、 [A][B][B][A][A,B]、および[B,A]は同等です。For instance, the attribute specifications [A][B], [B][A], [A,B], and [B,A] are equivalent.

global_attributes
    : global_attribute_section+
    ;

global_attribute_section
    : '[' global_attribute_target_specifier attribute_list ']'
    | '[' global_attribute_target_specifier attribute_list ',' ']'
    ;

global_attribute_target_specifier
    : global_attribute_target ':'
    ;

global_attribute_target
    : 'assembly'
    | 'module'
    ;

attributes
    : attribute_section+
    ;

attribute_section
    : '[' attribute_target_specifier? attribute_list ']'
    | '[' attribute_target_specifier? attribute_list ',' ']'
    ;

attribute_target_specifier
    : attribute_target ':'
    ;

attribute_target
    : 'field'
    | 'event'
    | 'method'
    | 'param'
    | 'property'
    | 'return'
    | 'type'
    ;

attribute_list
    : attribute (',' attribute)*
    ;

attribute
    : attribute_name attribute_arguments?
    ;

attribute_name
    : type_name
    ;

attribute_arguments
    : '(' positional_argument_list? ')'
    | '(' positional_argument_list ',' named_argument_list ')'
    | '(' named_argument_list ')'
    ;

positional_argument_list
    : positional_argument (',' positional_argument)*
    ;

positional_argument
    : attribute_argument_expression
    ;

named_argument_list
    : named_argument (','  named_argument)*
    ;

named_argument
    : identifier '=' attribute_argument_expression
    ;

attribute_argument_expression
    : expression
    ;

属性から成る、 attribute_nameと、省略可能な引数と名前付き引数のリスト。An attribute consists of an attribute_name and an optional list of positional and named arguments. 名前付き引数の前に、位置指定引数 (ある場合)。The positional arguments (if any) precede the named arguments. 位置指定引数から成る、 attribute_argument_expression; 名前付き引数を名の後に続く、等号 (=) から成る、 attribute_argument_expressionであり、まとめて、単純な代入と同じ規則によって制限されます。A positional argument consists of an attribute_argument_expression; a named argument consists of a name, followed by an equal sign, followed by an attribute_argument_expression, which, together, are constrained by the same rules as simple assignment. 名前付き引数の順序は大きくありません。The order of named arguments is not significant.

Attribute_name属性クラスを識別します。The attribute_name identifies an attribute class. 場合のフォームattribute_nametype_nameこの名前は、属性クラスに参照する必要があります。If the form of attribute_name is type_name then this name must refer to an attribute class. それ以外の場合は、コンパイル時のエラーが発生します。Otherwise, a compile-time error occurs. 例では、The example

class Class1 {}

[Class1] class Class2 {}    // Error

結果の使用を試むため、コンパイル時エラーClass1クラス属性としてClass1属性クラスではありません。results in a compile-time error because it attempts to use Class1 as an attribute class when Class1 is not an attribute class.

特定のコンテキストでは、1 つ以上のターゲットの属性の指定を許可します。Certain contexts permit the specification of an attribute on more than one target. 含めることによって、プログラムがターゲットを明示的に指定するattribute_target_specifierします。A program can explicitly specify the target by including an attribute_target_specifier. グローバル レベルでは、属性を配置すると、 global_attribute_target_specifierが必要です。When an attribute is placed at the global level, a global_attribute_target_specifier is required. その他のすべての場所で適切な既定値が適用されるがattribute_target_specifierを確認したり、または特定のあいまいな場合の既定値を上書きする (またはだけあいまいでない場合の既定値を確認する) に使用することができます。In all other locations, a reasonable default is applied, but an attribute_target_specifier can be used to affirm or override the default in certain ambiguous cases (or to just affirm the default in non-ambiguous cases). したがって、通常、 attribute_target_specifierグローバル レベルを除く s を省略できます。Thus, typically, attribute_target_specifiers can be omitted except at the global level. あいまいな可能性のあるコンテキストは、次のように解決されます。The potentially ambiguous contexts are resolved as follows:

  • グローバル スコープで指定された属性は、ターゲット アセンブリまたは対象のモジュールに適用できます。An attribute specified at global scope can apply either to the target assembly or the target module. 既定値が存在しない、このコンテキストのため、 attribute_target_specifierが常に、このコンテキストで必要です。No default exists for this context, so an attribute_target_specifier is always required in this context. 有無、 assembly attribute_target_specifier属性がターゲットに適用されることを示しますアセンブリ以外の存在、 module attribute_target_specifier 。ターゲット モジュールに属性が適用されることを示します。The presence of the assembly attribute_target_specifier indicates that the attribute applies to the target assembly; the presence of the module attribute_target_specifier indicates that the attribute applies to the target module.
  • デリゲート宣言で指定された属性は、宣言されているデリゲートまたはその戻り値のいずれかに適用できます。An attribute specified on a delegate declaration can apply either to the delegate being declared or to its return value. ない場合、 attribute_target_specifierデリゲートに属性が適用されます。In the absence of an attribute_target_specifier, the attribute applies to the delegate. 有無、 type attribute_target_specifier ; デリゲートに属性が適用されることを示しますの存在、 return attribute_target_specifier戻り値に属性が適用されることを示します。The presence of the type attribute_target_specifier indicates that the attribute applies to the delegate; the presence of the return attribute_target_specifier indicates that the attribute applies to the return value.
  • メソッド宣言で指定された属性は、宣言されているメソッドまたはその戻り値のいずれかに適用できます。An attribute specified on a method declaration can apply either to the method being declared or to its return value. ない場合、 attribute_target_specifierメソッドに属性が適用されます。In the absence of an attribute_target_specifier, the attribute applies to the method. 有無、 method attribute_target_specifierメソッドに属性が適用されることを示しますの存在、 return attribute_target_specifierを示します戻り値に属性が適用されます。The presence of the method attribute_target_specifier indicates that the attribute applies to the method; the presence of the return attribute_target_specifier indicates that the attribute applies to the return value.
  • 演算子の宣言で指定された属性は、宣言されている演算子またはその戻り値のいずれかに適用できます。An attribute specified on an operator declaration can apply either to the operator being declared or to its return value. ない場合、 attribute_target_specifier、演算子、属性が適用されます。In the absence of an attribute_target_specifier, the attribute applies to the operator. 有無、 method attribute_target_specifierには、演算子、属性が適用されることを示しますの存在、 return attribute_target_specifier戻り値に属性が適用されることを示します。The presence of the method attribute_target_specifier indicates that the attribute applies to the operator; the presence of the return attribute_target_specifier indicates that the attribute applies to the return value.
  • イベント アクセサーを省略するイベントの宣言で指定された属性では、宣言されるイベント、関連するフィールド (イベントが抽象でない場合)、または関連付けられている追加の適用でき、メソッドを削除することができます。An attribute specified on an event declaration that omits event accessors can apply to the event being declared, to the associated field (if the event is not abstract), or to the associated add and remove methods. ない場合、 attribute_target_specifierイベントに属性が適用されます。In the absence of an attribute_target_specifier, the attribute applies to the event. 有無、 event attribute_target_specifierイベントに属性が適用されることを示しますの存在、 field attribute_target_specifierを示しますフィールドに属性が適用されます。かどうか、 method attribute_target_specifierメソッドに属性が適用されることを示します。The presence of the event attribute_target_specifier indicates that the attribute applies to the event; the presence of the field attribute_target_specifier indicates that the attribute applies to the field; and the presence of the method attribute_target_specifier indicates that the attribute applies to the methods.
  • プロパティまたはインデクサーの宣言の get アクセサーの宣言で指定された属性は、関連付けられているメソッドまたはその戻り値のいずれかに適用できます。An attribute specified on a get accessor declaration for a property or indexer declaration can apply either to the associated method or to its return value. ない場合、 attribute_target_specifierメソッドに属性が適用されます。In the absence of an attribute_target_specifier, the attribute applies to the method. 有無、 method attribute_target_specifierメソッドに属性が適用されることを示しますの存在、 return attribute_target_specifierを示します戻り値に属性が適用されます。The presence of the method attribute_target_specifier indicates that the attribute applies to the method; the presence of the return attribute_target_specifier indicates that the attribute applies to the return value.
  • プロパティまたはインデクサーの宣言の set アクセサーに指定された属性は、関連付けられているメソッドまたはその唯一のパラメーターのいずれかに適用できます。An attribute specified on a set accessor for a property or indexer declaration can apply either to the associated method or to its lone implicit parameter. ない場合、 attribute_target_specifierメソッドに属性が適用されます。In the absence of an attribute_target_specifier, the attribute applies to the method. 有無、 method attribute_target_specifierメソッドに属性が適用されることを示しますの存在、 param attribute_target_specifierを示しますパラメーターの場合に、属性が適用されます。有無、 return attribute_target_specifier属性は、戻り値に適用されることを示します。The presence of the method attribute_target_specifier indicates that the attribute applies to the method; the presence of the param attribute_target_specifier indicates that the attribute applies to the parameter; the presence of the return attribute_target_specifier indicates that the attribute applies to the return value.
  • イベントの宣言は、関連付けられているメソッドまたはその唯一のパラメーターのいずれかを適用できます add または remove アクセサーの宣言で指定された属性です。An attribute specified on an add or remove accessor declaration for an event declaration can apply either to the associated method or to its lone parameter. ない場合、 attribute_target_specifierメソッドに属性が適用されます。In the absence of an attribute_target_specifier, the attribute applies to the method. 有無、 method attribute_target_specifierメソッドに属性が適用されることを示しますの存在、 param attribute_target_specifierを示しますパラメーターの場合に、属性が適用されます。有無、 return attribute_target_specifier属性は、戻り値に適用されることを示します。The presence of the method attribute_target_specifier indicates that the attribute applies to the method; the presence of the param attribute_target_specifier indicates that the attribute applies to the parameter; the presence of the return attribute_target_specifier indicates that the attribute applies to the return value.

他のコンテキストを含めることで、 attribute_target_specifierは許可されているが不要な。In other contexts, inclusion of an attribute_target_specifier is permitted but unnecessary. たとえば、クラス宣言を含めるか、指定子を省略type:For instance, a class declaration may either include or omit the specifier type:

[type: Author("Brian Kernighan")]
class Class1 {}

[Author("Dennis Ritchie")]
class Class2 {}

無効なを指定するとエラーにはattribute_target_specifierします。It is an error to specify an invalid attribute_target_specifier. 指定子、paramクラス宣言では使用できません。For instance, the specifier param cannot be used on a class declaration:

[param: Author("Brian Kernighan")]        // Error
class Class1 {}

サフィックスを持つ属性クラスの名前は慣例により、Attributeします。By convention, attribute classes are named with a suffix of Attribute. Attribute_nameフォームのtype_nameを含めるかこのサフィックスを省略することがあります。An attribute_name of the form type_name may either include or omit this suffix. このサフィックスの有無にかかわらず、属性クラスが見つかった場合、あいまいさが存在して、コンパイル時エラーが発生します。If an attribute class is found both with and without this suffix, an ambiguity is present, and a compile-time error results. 場合、 attribute_nameが入力されているように、右端の識別子逐語的識別子 (識別子)、サフィックスが付いていない属性だけが一致すると、その後あいまいさを解決できるようにします。If the attribute_name is spelled such that its right-most identifier is a verbatim identifier (Identifiers), then only an attribute without a suffix is matched, thus enabling such an ambiguity to be resolved. 例では、The example

using System;

[AttributeUsage(AttributeTargets.All)]
public class X: Attribute
{}

[AttributeUsage(AttributeTargets.All)]
public class XAttribute: Attribute
{}

[X]                     // Error: ambiguity
class Class1 {}

[XAttribute]            // Refers to XAttribute
class Class2 {}

[@X]                    // Refers to X
class Class3 {}

[@XAttribute]           // Refers to XAttribute
class Class4 {}

2 つの属性という名前のクラスを示していますXXAttributeします。shows two attribute classes named X and XAttribute. 属性[X]いずれかを参照しているため、あいまいになりますがXまたはXAttributeします。The attribute [X] is ambiguous, since it could refer to either X or XAttribute. 逐語的識別子を使用すると、このようなまれなケースで指定する正確なインテントができます。Using a verbatim identifier allows the exact intent to be specified in such rare cases. 属性[XAttribute]あいまいでない (がという名前の属性クラスがあったかどうかXAttributeAttribute!)。The attribute [XAttribute] is not ambiguous (although it would be if there was an attribute class named XAttributeAttribute!). 場合クラスの宣言Xが削除され、両方の属性がという名前の属性クラスを参照してXAttribute、次のようにします。If the declaration for class X is removed, then both attributes refer to the attribute class named XAttribute, as follows:

using System;

[AttributeUsage(AttributeTargets.All)]
public class XAttribute: Attribute
{}

[X]                     // Refers to XAttribute
class Class1 {}

[XAttribute]            // Refers to XAttribute
class Class2 {}

[@X]                    // Error: no attribute named "X"
class Class3 {}

同じエンティティについて単一使用属性クラスを複数回使用すると、コンパイル時エラーになります。It is a compile-time error to use a single-use attribute class more than once on the same entity. 例では、The example

using System;

[AttributeUsage(AttributeTargets.Class)]
public class HelpStringAttribute: Attribute
{
    string value;

    public HelpStringAttribute(string value) {
        this.value = value;
    }

    public string Value {
        get {...}
    }
}

[HelpString("Description of Class1")]
[HelpString("Another description of Class1")]
public class Class1 {}

結果の使用を試むため、コンパイル時エラー HelpString、単一使用属性クラスである、2 回以上の宣言でClass1します。results in a compile-time error because it attempts to use HelpString, which is a single-use attribute class, more than once on the declaration of Class1.

Eは、 attribute_argument_expressionのすべての次のステートメントに該当する場合。An expression E is an attribute_argument_expression if all of the following statements are true:

  • E属性パラメーター型は、(属性パラメーター型)。The type of E is an attribute parameter type (Attribute parameter types).
  • コンパイル時の値にE次のいずれかに解決できます。At compile-time, the value of E can be resolved to one of the following:
    • 定数値。A constant value.
    • System.Type オブジェクト。A System.Type object.
    • 1 次元配列attribute_argument_expression秒。A one-dimensional array of attribute_argument_expressions.

例:For example:

using System;

[AttributeUsage(AttributeTargets.Class)]
public class TestAttribute: Attribute
{
    public int P1 {
        get {...}
        set {...}
    }

    public Type P2 {
        get {...}
        set {...}
    }

    public object P3 {
        get {...}
        set {...}
    }
}

[Test(P1 = 1234, P3 = new int[] {1, 3, 5}, P2 = typeof(float))]
class MyClass {}

A typeof_expression (typeof 演算子) 属性引数の式は、非ジェネリック型、構築されたクローズ型、または、バインドされていないジェネリック型を参照できますが、これは参照できません、使用します。型を開きます。A typeof_expression (The typeof operator) used as an attribute argument expression can reference a non-generic type, a closed constructed type, or an unbound generic type, but it cannot reference an open type. これは、コンパイル時に式を解決できることを確認します。This is to ensure that the expression can be resolved at compile-time.

class A: Attribute
{
    public A(Type t) {...}
}

class G<T>
{
    [A(typeof(T))] T t;                  // Error, open type in attribute
}

class X
{
    [A(typeof(List<int>))] int x;        // Ok, closed constructed type
    [A(typeof(List<>))] int y;           // Ok, unbound generic type
}

属性インスタンスAttribute instances

属性インスタンスは実行時に属性を表すインスタンスです。An attribute instance is an instance that represents an attribute at run-time. 属性は、位置指定引数は、属性クラスで定義されているし、名前付き引数。An attribute is defined with an attribute class, positional arguments, and named arguments. 属性インスタンスは、位置指定引数と名前付き引数を使用して初期化される属性クラスのインスタンスです。An attribute instance is an instance of the attribute class that is initialized with the positional and named arguments.

属性インスタンスの取得には、次のセクションで説明した、コンパイル時と実行時の両方の処理が含まれます。Retrieval of an attribute instance involves both compile-time and run-time processing, as described in the following sections.

属性のコンパイルCompilation of an attribute

コンパイル、属性属性クラスを使用してTpositional_argument_list Pnamed_argument_list N、次の手順で構成されます。The compilation of an attribute with attribute class T, positional_argument_list P and named_argument_list N, consists of the following steps:

  • コンパイル時の処理手順をコンパイルするため、 object_creation_expressionフォームのnew T(P)します。Follow the compile-time processing steps for compiling an object_creation_expression of the form new T(P). 次の手順は、コンパイル時エラーが発生するか、インスタンス コンス トラクターを判断CTは、実行時に呼び出すことができます。These steps either result in a compile-time error, or determine an instance constructor C on T that can be invoked at run-time.
  • 場合Cパブリック アクセシビリティを持たない場合、コンパイル時エラーが発生します。If C does not have public accessibility, then a compile-time error occurs.
  • named_argument ArgN:For each named_argument Arg in N:
    • ようにNameする、識別子named_argument Argします。Let Name be the identifier of the named_argument Arg.
    • Name 非静的な読み取り/書き込みのパブリック フィールドまたはプロパティを識別する必要がありますTします。Name must identify a non-static read-write public field or property on T. 場合Tコンパイル時エラーが発生し、そのようなフィールドまたはプロパティを持ちます。If T has no such field or property, then a compile-time error occurs.
  • 属性の実行時インスタンスを作成して、次の情報を保持します属性クラスT、インスタンス コンス トラクターCTpositional_argument_list P 。およびnamed_argument_list Nします。Keep the following information for run-time instantiation of the attribute: the attribute class T, the instance constructor C on T, the positional_argument_list P and the named_argument_list N.

属性インスタンスの実行時の取得Run-time retrieval of an attribute instance

コンパイル、属性属性クラスを生成T、インスタンス コンス トラクターCTpositional_argument_list P、およびnamed_argument_list Nします。Compilation of an attribute yields an attribute class T, an instance constructor C on T, a positional_argument_list P, and a named_argument_list N. この情報を指定するには、属性インスタンスが、次の手順を使用して実行時に取得できます。Given this information, an attribute instance can be retrieved at run-time using the following steps:

  • 実行時の処理手順を実行するため、 object_creation_expressionフォームのnew T(P)、インスタンス コンス トラクターを使用してCコンパイル時に決定されます。Follow the run-time processing steps for executing an object_creation_expression of the form new T(P), using the instance constructor C as determined at compile-time. 次の手順は、例外、またはインスタンスを作成しますOTします。These steps either result in an exception, or produce an instance O of T.
  • named_argument ArgNの順序で。For each named_argument Arg in N, in order:
    • ようにNameする、識別子named_argument Argします。Let Name be the identifier of the named_argument Arg. 場合Nameで静的でないパブリックの読み取り/書き込みフィールドまたはプロパティを識別しないいないO例外がスローされます。If Name does not identify a non-static public read-write field or property on O, then an exception is thrown.
    • ようにValue評価の結果である、 attribute_argument_expressionArgします。Let Value be the result of evaluating the attribute_argument_expression of Arg.
    • 場合Nameでフィールドを識別するOにこのフィールドを設定Valueします。If Name identifies a field on O, then set this field to Value.
    • それ以外の場合、Nameでプロパティを識別しますOします。Otherwise, Name identifies a property on O. このプロパティを設定Valueします。Set this property to Value.
    • 結果はO、属性クラスのインスタンスTで初期化されました、 positional_argument_list Pnamed_argument_listN.The result is O, an instance of the attribute class T that has been initialized with the positional_argument_list P and the named_argument_list N.

予約済みの属性Reserved attributes

属性の数が少ないでは、何らかの方法で、言語に影響します。A small number of attributes affect the language in some way. これらの属性は次のとおりです。These attributes include:

  • System.AttributeUsageAttribute (、AttributeUsage 属性) を使用して、属性クラスを使用できる方法について説明します。System.AttributeUsageAttribute (The AttributeUsage attribute), which is used to describe the ways in which an attribute class can be used.
  • System.Diagnostics.ConditionalAttribute (、条件付き属性)、これは条件付きメソッドの定義に使用します。System.Diagnostics.ConditionalAttribute (The Conditional attribute), which is used to define conditional methods.
  • System.ObsoleteAttribute (The Obsolete 属性)、不使用とメンバーを示すために使用します。System.ObsoleteAttribute (The Obsolete attribute), which is used to mark a member as obsolete.
  • System.Runtime.CompilerServices.CallerLineNumberAttributeSystem.Runtime.CompilerServices.CallerFilePathAttributeSystem.Runtime.CompilerServices.CallerMemberNameAttribute(呼び出し元情報属性)、省略可能なパラメーターを呼び出し元のコンテキストに関する情報を入力に使用されます。System.Runtime.CompilerServices.CallerLineNumberAttribute, System.Runtime.CompilerServices.CallerFilePathAttribute and System.Runtime.CompilerServices.CallerMemberNameAttribute (Caller info attributes), which are used to supply information about the calling context to optional parameters.

AttributeUsage 属性The AttributeUsage attribute

属性AttributeUsage属性クラスを使用できる方法を説明するために使用します。The attribute AttributeUsage is used to describe the manner in which the attribute class can be used.

装飾したクラス、AttributeUsage属性から派生しなければなりませんSystem.Attribute、直接または間接的にします。A class that is decorated with the AttributeUsage attribute must derive from System.Attribute, either directly or indirectly. それ以外の場合は、コンパイル時のエラーが発生します。Otherwise, a compile-time error occurs.

namespace System
{
    [AttributeUsage(AttributeTargets.Class)]
    public class AttributeUsageAttribute: Attribute
    {
        public AttributeUsageAttribute(AttributeTargets validOn) {...}
        public virtual bool AllowMultiple { get {...} set {...} }
        public virtual bool Inherited { get {...} set {...} }
        public virtual AttributeTargets ValidOn { get {...} }
    }

    public enum AttributeTargets
    {
        Assembly     = 0x0001,
        Module       = 0x0002,
        Class        = 0x0004,
        Struct       = 0x0008,
        Enum         = 0x0010,
        Constructor  = 0x0020,
        Method       = 0x0040,
        Property     = 0x0080,
        Field        = 0x0100,
        Event        = 0x0200,
        Interface    = 0x0400,
        Parameter    = 0x0800,
        Delegate     = 0x1000,
        ReturnValue  = 0x2000,

        All = Assembly | Module | Class | Struct | Enum | Constructor | 
            Method | Property | Field | Event | Interface | Parameter | 
            Delegate | ReturnValue
    }
}

条件付き属性The Conditional attribute

属性Conditionalの定義を有効に条件付きメソッド条件付き属性クラスします。The attribute Conditional enables the definition of conditional methods and conditional attribute classes.

namespace System.Diagnostics
{
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true)]
    public class ConditionalAttribute: Attribute
    {
        public ConditionalAttribute(string conditionString) {...}
        public string ConditionString { get {...} }
    }
}

条件付きメソッドConditional methods

修飾されたメソッド、Conditional属性は、条件付きメソッド。A method decorated with the Conditional attribute is a conditional method. Conditional属性は、条件付きコンパイル シンボルをテストして条件を示します。The Conditional attribute indicates a condition by testing a conditional compilation symbol. 条件付きメソッドの呼び出しをに含まれるか、または省略すると、呼び出しの時点でこのシンボルが定義されているかどうかによって異なります。Calls to a conditional method are either included or omitted depending on whether this symbol is defined at the point of the call. 呼び出しが含まれています。 シンボルが定義されている場合それ以外の場合、(受信者の評価と呼び出しのパラメーターを含む) の呼び出しは省略されます。If the symbol is defined, the call is included; otherwise, the call (including evaluation of the receiver and parameters of the call) is omitted.

条件付きメソッドは、次の制限を受けます。A conditional method is subject to the following restrictions:

  • 条件付きメソッドのメソッドである必要があります、 class_declarationまたはstruct_declarationします。The conditional method must be a method in a class_declaration or struct_declaration. コンパイル時エラーが発生します、Conditionalインターフェイス宣言のメソッドに属性を指定します。A compile-time error occurs if the Conditional attribute is specified on a method in an interface declaration.
  • 条件付きメソッドの戻り値の型がありますvoidします。The conditional method must have a return type of void.
  • 条件付きメソッドがでマークされていない必要があります、override修飾子。The conditional method must not be marked with the override modifier. 条件付きメソッドをマークすることがあります、virtual修飾子、ただしします。A conditional method may be marked with the virtual modifier, however. このようなメソッドのオーバーライドは暗黙的に条件付きとでない、明示的にマークする必要があります、Conditional属性。Overrides of such a method are implicitly conditional, and must not be explicitly marked with a Conditional attribute.
  • 条件付きメソッドは、インターフェイス メソッドの実装があります。The conditional method must not be an implementation of an interface method. それ以外の場合は、コンパイル時のエラーが発生します。Otherwise, a compile-time error occurs.

さらに、コンパイル時エラーが発生する条件付きメソッドで使用する場合、 delegate_creation_expressionします。In addition, a compile-time error occurs if a conditional method is used in a delegate_creation_expression. 例では、The example

#define DEBUG

using System;
using System.Diagnostics;

class Class1 
{
    [Conditional("DEBUG")]
    public static void M() {
        Console.WriteLine("Executed Class1.M");
    }
}

class Class2
{
    public static void Test() {
        Class1.M();
    }
}

宣言Class1.M条件付きメソッドとして。declares Class1.M as a conditional method. Class2``Testメソッドは、このメソッドを呼び出します。Class2's Test method calls this method. 条件付きコンパイル シンボル以降DEBUGが定義されている場合は場合、Class2.Testが呼び出されると、それが呼び出すMします。Since the conditional compilation symbol DEBUG is defined, if Class2.Test is called, it will call M. 場合、シンボルDEBUGが定義されていない、しClass2.Test呼び出さないClass1.Mします。If the symbol DEBUG had not been defined, then Class2.Test would not call Class1.M.

呼び出しの時点の条件付きコンパイル シンボルを含めるか、条件付きメソッドの呼び出しの除外を制御することに注意してください。It is important to note that the inclusion or exclusion of a call to a conditional method is controlled by the conditional compilation symbols at the point of the call. In the example

ファイルclass1.cs:File class1.cs:

using System.Diagnostics;

class Class1 
{
    [Conditional("DEBUG")]
    public static void F() {
        Console.WriteLine("Executed Class1.F");
    }
}

ファイルclass2.cs:File class2.cs:

#define DEBUG

class Class2
{
    public static void G() {
        Class1.F();                // F is called
    }
}

ファイルclass3.cs:File class3.cs:

#undef DEBUG

class Class3
{
    public static void H() {
        Class1.F();                // F is not called
    }
}

クラスは、Class2Class3条件付きメソッドの呼び出しを含む各Class1.F、かどうかに基づく条件付きであるDEBUGが定義されています。the classes Class2 and Class3 each contain calls to the conditional method Class1.F, which is conditional based on whether or not DEBUG is defined. コンテキストでこのシンボルが定義されているためClass2なくClass3への呼び出しFClass2への呼び出し中に、含まれているFClass3を省略するとします。Since this symbol is defined in the context of Class2 but not Class3, the call to F in Class2 is included, while the call to F in Class3 is omitted.

継承チェーンで条件付きメソッドを使用してわかりにくいことができます。The use of conditional methods in an inheritance chain can be confusing. 条件付きメソッドを呼び出しbase、フォームのbase.M、通常の条件付きメソッドの呼び出し規則が適用されます。Calls made to a conditional method through base, of the form base.M, are subject to the normal conditional method call rules. In the example

ファイルclass1.cs:File class1.cs:

using System;
using System.Diagnostics;

class Class1 
{
    [Conditional("DEBUG")]
    public virtual void M() {
        Console.WriteLine("Class1.M executed");
    }
}

ファイルclass2.cs:File class2.cs:

using System;

class Class2: Class1
{
    public override void M() {
        Console.WriteLine("Class2.M executed");
        base.M();                        // base.M is not called!
    }
}

ファイルclass3.cs:File class3.cs:

#define DEBUG

using System;

class Class3
{
    public static void Test() {
        Class2 c = new Class2();
        c.M();                            // M is called
    }
}

Class2 呼び出しを含み、M基底クラスで定義されています。Class2 includes a call to the M defined in its base class. この呼び出しを省略したは、基本のメソッドでは、シンボルの有無に基づく条件付き理由DEBUGは定義されていません。This call is omitted because the base method is conditional based on the presence of the symbol DEBUG, which is undefined. したがって、メソッドは、コンソールに書き込みます"Class2.M executed"のみです。Thus, the method writes to the console "Class2.M executed" only. 賢く利用pp_declarations は、このような問題を排除できます。Judicious use of pp_declarations can eliminate such problems.

条件付き属性クラスConditional attribute classes

属性クラス (属性クラス) 1 つまたは複数で修飾されたConditional属性は、条件付き属性クラスします。An attribute class (Attribute classes) decorated with one or more Conditional attributes is a conditional attribute class. 宣言されている条件付きコンパイル シンボルを使用した条件付き属性クラスが関連付けられているなりますそのConditional属性。A conditional attribute class is thus associated with the conditional compilation symbols declared in its Conditional attributes. この例の場合:This example:

using System;
using System.Diagnostics;
[Conditional("ALPHA")]
[Conditional("BETA")]
public class TestAttribute : Attribute {}

宣言TestAttribute条件付きコンパイル シンボルに関連付けられた条件属性をクラスとしてALPHABETAします。declares TestAttribute as a conditional attribute class associated with the conditional compilations symbols ALPHA and BETA.

属性の仕様 (属性の指定) の条件付き属性が含まれる 1 つ以上の関連付けられている条件付きコンパイル シンボルが定義されている場合、仕様の時点でそれ以外の場合、属性指定は省略されます。Attribute specifications (Attribute specification) of a conditional attribute are included if one or more of its associated conditional compilation symbols is defined at the point of specification, otherwise the attribute specification is omitted.

仕様の時点で条件付きコンパイル シンボルでの追加または条件付き属性クラスの属性の指定の除外を制御することに注意してください。 重要です。It is important to note that the inclusion or exclusion of an attribute specification of a conditional attribute class is controlled by the conditional compilation symbols at the point of the specification. In the example

ファイルtest.cs:File test.cs:

using System;
using System.Diagnostics;

[Conditional("DEBUG")]

public class TestAttribute : Attribute {}

ファイルclass1.cs:File class1.cs:

#define DEBUG

[Test]                // TestAttribute is specified

class Class1 {}

ファイルclass2.cs:File class2.cs:

#undef DEBUG

[Test]                 // TestAttribute is not specified

class Class2 {}

クラスは、Class1Class2は属性で修飾された各Test、かどうかに基づく条件付きであるDEBUGが定義されています。the classes Class1 and Class2 are each decorated with attribute Test, which is conditional based on whether or not DEBUG is defined. コンテキストでこのシンボルが定義されているためClass1なくClass2の仕様、Test属性Class1の仕様の中に、含まれている、Test属性をClass2を省略するとします。Since this symbol is defined in the context of Class1 but not Class2, the specification of the Test attribute on Class1 is included, while the specification of the Test attribute on Class2 is omitted.

Obsolete 属性The Obsolete attribute

属性Obsolete使用できなくする型の型とメンバーをマークするために使用します。The attribute Obsolete is used to mark types and members of types that should no longer be used.

namespace System
{
    [AttributeUsage(
        AttributeTargets.Class | 
        AttributeTargets.Struct |
        AttributeTargets.Enum | 
        AttributeTargets.Interface | 
        AttributeTargets.Delegate |
        AttributeTargets.Method | 
        AttributeTargets.Constructor |
        AttributeTargets.Property | 
        AttributeTargets.Field |
        AttributeTargets.Event,
        Inherited = false)
    ]
    public class ObsoleteAttribute: Attribute
    {
        public ObsoleteAttribute() {...}
        public ObsoleteAttribute(string message) {...}
        public ObsoleteAttribute(string message, bool error) {...}
        public string Message { get {...} }
        public bool IsError { get {...} }
    }
}

プログラムを使用して、型またはメンバーで装飾したかどうか、Obsolete属性に、コンパイラは、警告またはエラーを発行します。If a program uses a type or member that is decorated with the Obsolete attribute, the compiler issues a warning or an error. エラー パラメーターが指定されていない場合、または error パラメーターを指定し、値を持つ場合に、コンパイラが警告を発行する具体的には、falseします。Specifically, the compiler issues a warning if no error parameter is provided, or if the error parameter is provided and has the value false. エラー パラメーターを指定し、値を持つ場合、コンパイラがエラーを発行trueします。The compiler issues an error if the error parameter is specified and has the value true.

In the example

[Obsolete("This class is obsolete; use class B instead")]
class A
{
    public void F() {}
}

class B
{
    public void F() {}
}

class Test
{
    static void Main() {
        A a = new A();         // Warning
        a.F();
    }
}

クラスは、Aで修飾されたが、Obsolete属性。the class A is decorated with the Obsolete attribute. 各使用AMainで指定されたメッセージを含む警告結果は、"このクラスは廃止されています。クラス B 代わりに使用します。"Each use of A in Main results in a warning that includes the specified message, "This class is obsolete; use class B instead."

呼び出し元情報属性Caller info attributes

ログ記録やレポートなどの目的で、関数メンバー呼び出し元のコードに関する特定のコンパイル時情報を取得するのに便利ですがあります。For purposes such as logging and reporting, it is sometimes useful for a function member to obtain certain compile-time information about the calling code. 呼び出し元情報属性は、このような情報を透過的に渡す方法を提供します。The caller info attributes provide a way to pass such information transparently.

オプションのパラメーターは、呼び出し元情報属性のいずれかで注釈が付け、呼び出しに対応する引数を省略することは必ずしも代わりに使用する既定のパラメーター値。When an optional parameter is annotated with one of the caller info attributes, omitting the corresponding argument in a call does not necessarily cause the default parameter value to be substituted. 代わりに、指定した呼び出し元のコンテキストに関する情報を使用できる場合、その情報は、引数の値として渡されます。Instead, if the specified information about the calling context is available, that information will be passed as the argument value.

例:For example:

using System.Runtime.CompilerServices

...

public void Log(
    [CallerLineNumber] int line = -1,
    [CallerFilePath]   string path = null,
    [CallerMemberName] string name = null
)
{
    Console.WriteLine((line < 0) ? "No line" : "Line "+ line);
    Console.WriteLine((path == null) ? "No file path" : path);
    Console.WriteLine((name == null) ? "No member name" : name);
}

呼び出しLog()引数なしで印刷には、呼び出しの行の数とファイルのパスとを呼び出しが発生したメンバーの名前。A call to Log() with no arguments would print the line number and file path of the call, as well as the name of the member within which the call occurred.

呼び出し元情報属性は、デリゲートの宣言を含む省略可能なパラメーターなど、どこで実行できます。Caller info attributes can occur on optional parameters anywhere, including in delegate declarations. ただし、特定の呼び出し元情報属性では、パラメーターの型に代入された値から暗黙的な変換が必ずようにができる属性は、パラメーターの型に制限があります。However, the specific caller info attributes have restrictions on the types of the parameters they can attribute, so that there will always be an implicit conversion from a substituted value to the parameter type.

同じ呼び出し元情報属性を定義して、部分メソッド宣言の一部を実装する両方のパラメーターがエラーになります。It is an error to have the same caller info attribute on a parameter of both the defining and implementing part of a partial method declaration. 実装の一部でのみ発生している呼び出し元情報属性は無視されますが、定義の一部で呼び出し元情報属性のみが適用されます。Only caller info attributes in the defining part are applied, whereas caller info attributes occurring only in the implementing part are ignored.

呼び出し元情報は、オーバー ロードの解決には影響しません。Caller information does not affect overload resolution. オーバー ロードの解決が省略されたその他の省略可能なパラメーターは無視されますが、同じ方法でこれらのパラメーターを無視する属性付きの省略可能なパラメーターは、呼び出し元のソース コードから省略されますが、(オーバー ロードの解決)。As the attributed optional parameters are still omitted from the source code of the caller, overload resolution ignores those parameters in the same way it ignores other omitted optional parameters (Overload resolution).

関数がソース コードで明示的に呼び出されるときにのみ、呼び出し元情報が置き換えられます。Caller information is only substituted when a function is explicitly invoked in source code. 親の暗黙的なコンス トラクターの呼び出しなど暗黙的な呼び出しでは、ソースの場所がないと、呼び出し元情報は置き換えられません。Implicit invocations such as implicit parent constructor calls do not have a source location and will not substitute caller information. また、動的にバインドされている呼び出しに呼び出し元情報は置き換えられません。Also, calls that are dynamically bound will not substitute caller information. ときに、呼び出し元情報をこのような場合で属性付きのパラメーターを省略すると、パラメーターの指定した既定値が代わりに使用されます。When a caller info attributed parameter is omitted in such cases, the specified default value of the parameter is used instead.

クエリ式は例外です。One exception is query-expressions. これらは構文の拡張と見なされ、呼び出し、呼び出し元情報属性を持つオプション パラメーターを省略するを展開する場合、呼び出し元情報が置き換えられます。These are considered syntactic expansions, and if the calls they expand to omit optional parameters with caller info attributes, caller information will be substituted. 使用されている場所では、呼び出しはから生成されたクエリ句の場所です。The location used is the location of the query clause which the call was generated from.

次の順序で優先設定されているパラメーターを 1 つ以上の呼び出し元情報属性が指定されている場合: CallerLineNumberCallerFilePathCallerMemberNameします。If more than one caller info attribute is specified on a given parameter, they are preferred in the following order: CallerLineNumber, CallerFilePath, CallerMemberName.

CallerLineNumber 属性The CallerLineNumber attribute

System.Runtime.CompilerServices.CallerLineNumberAttributeは省略可能なパラメーターで許可されている標準の暗黙的な変換がある場合に (標準の暗黙的な変換) 定数の値からint.MaxValueパラメーターの型にします。The System.Runtime.CompilerServices.CallerLineNumberAttribute is allowed on optional parameters when there is a standard implicit conversion (Standard implicit conversions) from the constant value int.MaxValue to the parameter's type. これにより、エラーが発生せず、その値になるまでの任意の負でない行番号を渡すことができます。This ensures that any non-negative line number up to that value can be passed without error.

ソース コード内の場所から関数の呼び出しは省略可能なパラメーターを省略する場合、 CallerLineNumberAttribute、その場所の行番号を表す数値リテラルが既定のパラメーター値ではなく、呼び出しに引数として使用されます。If a function invocation from a location in source code omits an optional parameter with the CallerLineNumberAttribute, then a numeric literal representing that location's line number is used as an argument to the invocation instead of the default parameter value.

呼び出しは、複数の行にまたがっている場合、選択した行は実装依存を使用します。If the invocation spans multiple lines, the line chosen is implementation-dependent.

行番号の影響を受ける可能性がありますので注意#lineディレクティブ (ディレクティブの行)。Note that the line number may be affected by #line directives (Line directives).

CallerFilePath 属性The CallerFilePath attribute

System.Runtime.CompilerServices.CallerFilePathAttributeは省略可能なパラメーターで許可されている標準の暗黙的な変換がある場合に (標準の暗黙的な変換) からstringパラメーターの型にします。The System.Runtime.CompilerServices.CallerFilePathAttribute is allowed on optional parameters when there is a standard implicit conversion (Standard implicit conversions) from string to the parameter's type.

ソース コード内の場所から関数の呼び出しは省略可能なパラメーターを省略する場合、 CallerFilePathAttribute、その場所のファイル パスを表す文字列リテラルが既定のパラメーター値ではなく、呼び出しに引数として使用されます。If a function invocation from a location in source code omits an optional parameter with the CallerFilePathAttribute, then a string literal representing that location's file path is used as an argument to the invocation instead of the default parameter value.

ファイルのパスの形式は、実装によって異なります。The format of the file path is implementation-dependent.

ファイルのパスはによって影響を受ける可能性がありますので注意#lineディレクティブ (ディレクティブの行)。Note that the file path may be affected by #line directives (Line directives).

CallerMemberName 属性The CallerMemberName attribute

System.Runtime.CompilerServices.CallerMemberNameAttributeは省略可能なパラメーターで許可されている標準の暗黙的な変換がある場合に (標準の暗黙的な変換) からstringパラメーターの型にします。The System.Runtime.CompilerServices.CallerMemberNameAttribute is allowed on optional parameters when there is a standard implicit conversion (Standard implicit conversions) from string to the parameter's type.

ソース コードでは省略可能なパラメーターを省略自体またはその戻り値の型、パラメーターまたは型パラメーターで、関数メンバーの本文内または属性内の場所から関数の呼び出しが関数メンバーに適用されている場合、 CallerMemberNameAttribute、そのメンバーの名前を表す文字列リテラルは、パラメーターの既定値ではなく、呼び出しの引数として使用されます。If a function invocation from a location within the body of a function member or within an attribute applied to the function member itself or its return type, parameters or type parameters in source code omits an optional parameter with the CallerMemberNameAttribute, then a string literal representing the name of that member is used as an argument to the invocation instead of the default parameter value.

ジェネリック メソッド内で発生する呼び出しは、型パラメーター リストなし、メソッド名のみを使用します。For invocations that occur within generic methods, only the method name itself is used, without the type parameter list.

呼び出しで明示的なインターフェイス メンバーの実装内で発生する、上記のインターフェイス修飾なし、メソッド名自体は使用されます。For invocations that occur within explicit interface member implementations, only the method name itself is used, without the preceding interface qualification.

プロパティまたはイベントのアクセサー内で発生するための呼び出し、メンバー名を使用するプロパティまたはイベント自体は。For invocations that occur within property or event accessors, the member name used is that of the property or event itself.

インデクサーのアクセサー内で発生する呼び出しでは、使用されるメンバーの名前は、によって指定された、 IndexerNameAttribute (、IndexerName 属性) 存在する場合は、インデクサーのメンバーまたは既定の名前でItemそれ以外の場合。For invocations that occur within indexer accessors, the member name used is that supplied by an IndexerNameAttribute (The IndexerName attribute) on the indexer member, if present, or the default name Item otherwise.

呼び出しで、メンバーのインスタンス コンス トラクター、静的コンス トラクター、デストラクター、および演算子の宣言内で発生するは、使用される名前は、実装によって異なります。For invocations that occur within declarations of instance constructors, static constructors, destructors and operators the member name used is implementation-dependent.

相互運用の属性Attributes for Interoperation

メモ:このセクションでは、c# の Microsoft .NET の実装にのみ適用されます。Note: This section is applicable only to the Microsoft .NET implementation of C#.

COM および Win32 コンポーネントとの相互運用Interoperation with COM and Win32 components

.NET ランタイムでは、COM と Win32 の Dll を使用して記述されたコンポーネントと相互運用する c# プログラムを有効にする属性の数が多いを提供します。The .NET run-time provides a large number of attributes that enable C# programs to interoperate with components written using COM and Win32 DLLs. たとえば、DllImportで属性を使用できます、static externに Win32 DLL に含まれるメソッドの実装があることを示す方法。For example, the DllImport attribute can be used on a static extern method to indicate that the implementation of the method is to be found in a Win32 DLL. これらの属性がある、System.Runtime.InteropServices名前空間、およびこれらの属性の詳細なドキュメントが、.NET ランタイムのドキュメントが見つかりました。These attributes are found in the System.Runtime.InteropServices namespace, and detailed documentation for these attributes is found in the .NET runtime documentation.

他の .NET 言語との相互運用Interoperation with other .NET languages

IndexerName 属性The IndexerName attribute

インデクサーはインデックス付きのプロパティを使用して .NET で実装され、名前 .NET メタデータであります。Indexers are implemented in .NET using indexed properties, and have a name in the .NET metadata. ない場合はIndexerName属性は、インデクサーでは、その名前存在Item既定で使用されます。If no IndexerName attribute is present for an indexer, then the name Item is used by default. IndexerName属性により、開発者はこの既定をオーバーライドし、別の名前を指定します。The IndexerName attribute enables a developer to override this default and specify a different name.

namespace System.Runtime.CompilerServices.CSharp
{
    [AttributeUsage(AttributeTargets.Property)]
    public class IndexerNameAttribute: Attribute
    {
        public IndexerNameAttribute(string indexerName) {...}
        public string Value { get {...} } 
    }
}