次の方法で共有


メソッドを拡張可能にする属性

この記事では、メソッドの拡張性機能を制御するために使用できるさまざまな属性について説明します。

次の表は、メソッドの拡張性およびアクセシビリティの既定のサポートの概要を提供します。 さらに、メソッド シグネチャの変更に関するガイダンスも提供します。

属性 フック可能 折り返し可能 置き換え可能 アクセシビリティ 署名
プライベート 該当なし 該当なし 定義されているクラス内からアクセスできます。 シグネチャは変更可能
内部保護 いいえ はい。プラットフォーム更新 25 以降から いいえ 定義されているクラスから、および同じモデル内の派生クラスからアクセス可能です。 シグネチャでは互換性が維持されている必要があります
国内 同じモデルでアクセスできます。 シグネチャは変更可能
保護 いいえ はい。最終とマークされている場合以外 いいえ 定義されているクラスから、および派生クラスからアクセス可能です。 シグネチャでは互換性が維持されている必要があります
パブリック はい はい。最終とマークされている場合以外 いいえ 定義されたクラス、派生クラス、および定義するクラスにアクセスできるその他のクラスからアクセス可能です。 シグネチャでは互換性が維持されている必要があります

フック可能

メソッドがフック可能な場合、拡張担当者はプリイベントとポストイベントにサブスクライブできます。

パブリック メソッドの場合、メソッドに Hookable(false) を追加することでオプトアウトできます。

[Hookable(true)] をメソッドに追加して、プライベートおよび保護されたメソッドをオプトインできます。

メソッドが明示的に [Hookable(false)] とマークされている場合、折り返しはできません。

コードの作成時のベスト プラクティス

メソッドがフック可能な場合、コンパイラは拡張ポイントでメソッドを有効にするために特別な中間言語 (IL) コードを生成します。 余分なコードにはパフォーマンスのオーバーヘッドがありますが、このオーバーヘッドはほとんどの場合は無視できます。 ただし、パフォーマンスが重要なメソッドでは、フック不能としてメソッドをマーキングすることを検討してください。

折り返し可能

メソッドが折り返し可能な場合は、拡張担当者はコマンド チェーン (CoC) を使用して折り返すことができます。 拡張担当者は、CoC を中断することが許可されていないため、次を呼び出す必要があります。

保護されたパブリック メソッドの場合、メソッドに [Wrappable(false)] を追加することでオプトアウトできます。

プライベート メソッドをオプトインすることはできません。

コードの作成時のベスト プラクティス

CoC は、さまざまな点で継承に似ています。 通常、他のユーザーが変更するのではなくメソッドを呼び出すことができるようにするには、最終としてメソッドをマークします。 これらのメソッドを折り返し不可またはフック不可としてマーキングすることを検討してください。

置き換え可能

メソッドが置き換え可能な場合は、拡張担当者は CoC を使用して折り返しできますが、無条件に次を呼び出す必要はありません。 拡張担当者は CoC を中断できますが、条件がある場合のみ中断することが期待されます。 コンパイラは、次の呼び出しを強制しません。

置き換え可能にするには、メソッドも折り返し可能である必要があります。

折り返し可能なメソッドの場合、メソッドに [Replaceable] を追加することでオプトインできます。

コードの作成時のベスト プラクティス

メソッドの置き換え可能な場合、CoC を使用して拡張することができ、次の実行をスキップできます。 メソッドを置き換え可能にできるようにする前に、拡張担当者がメソッドの実行をスキップした場合の機能への影響を十分に評価する必要があります。

  • 作成する必要があります [Replaceable] メソッドの責任を説明するXMLドキュメントを格納してください。

  • 置換されたロジック[置換可能] をスキップして何も実行しない場合は、この手順を実行してください。

  • その代 [置換可能] 工場のメソッドの場合 入れ替え 使用できます。

  • メソッド またはクラスの状態 変更する前に、[置換可能] を使用することはできません。

  • 回避 使用 [置換可能] メソッドが複数の操作を実行し、複数の責任を負う場合)。 代わりに、それぞれが単一の責任を持つ別個のメソッドにメソッドをリファクタリングし、どのメソッドを実際に置き換え可能にする必要があるかを検討します。

  • 変換 解決 [置換可能] を考慮してください。

    例 : 列挙型に変更された値に対してswitchステートメント列挙型する換算を実行します (この場合、既定のブロックには変更が加え動作します)。

  • ルックアップ ジャンプ する場合、[置換可能] を考慮してください。

拡張担当者のベスト プラクティス

  • 置換される とは異なる責任を持つ論理を作成しない。
  • 交換 適用されない場合は、基本機能 (次に呼び出す) を行います。
  • 基本 を呼び出すことによって、ロジックを完全に表現しないようにします (次に呼び出します)。