クラスおよびメンバのスコープで使用される宣言セキュリティ
宣言セキュリティは、クラス、メンバ、および入れ子のクラスに実行できます。このセクションでは、宣言セキュリティが同じクラスの複数のレベルに適用されたとき、その宣言セキュリティの評価に使用される規則の概要について説明します。
クラス、メンバ、および宣言セキュリティ
同じセキュリティ アクションに対してクラス レベルとメソッド レベルの両方の宣言セキュリティがある場合、宣言セキュリティは次の表に従って適用されます。
セキュリティ アクション | .NET Framework Version 1.0 および 1.1 の動作 | NET Framework Version 2.0 の動作 |
---|---|---|
確認要求 |
メソッド レベルの属性は、クラス レベルの属性をオーバーライドします。宣言的な確認要求がメソッド レベルに置かれている場合、クラス レベルの宣言的な確認要求は無視されます。 |
メソッド レベルの属性とクラス レベルの属性は、両方のレベルに対して単一のアクセス許可セットに統合されます。 |
リンク確認要求 |
メソッド レベルの属性とクラス レベルの属性は統合されます。 |
動作に変更はありません。 |
継承確認要求 |
クラス レベルの属性には、クラスから派生するために指定されたアクセス許可が必要です。 メソッド レベルの属性には、派生したクラスでメソッドをオーバーライドするために指定されたアクセス許可が必要です。 継承確認要求はクラスとメソッドでは意味が異なるため、宣言はクラス レベルとメソッド レベルの両方にそれぞれ独立して適用できます。 |
動作に変更はありません。 |
Assert |
メソッド レベルの属性は、クラス レベルの属性をオーバーライドします。 |
メソッド レベルの属性とクラス レベルの属性は、両方のレベルに対して単一のアクセス許可セットに統合されます。 |
Deny |
メソッド レベルの属性は、クラス レベルの属性をオーバーライドします。 |
メソッド レベルの属性とクラス レベルの属性は、両方のレベルに対して単一のアクセス許可セットに統合されます。 |
許可のみ |
メソッド レベルの属性は、クラス レベルの属性をオーバーライドします。 |
メソッド レベルの属性とクラス レベルの属性は、両方のレベルに対して単一のアクセス許可セットに交差されます。 |
セキュリティ アクションが異なる場合 (たとえば、クラス レベルの要求がメソッド レベルのアサートを伴う場合) は、やり取りはまったくなく、両方とも評価されます。
入れ子のクラスと宣言セキュリティ
宣言セキュリティをクラスに適用するとき、それは入れ子のクラスや入れ子のクラスのメソッドには反映されません。これとは逆に、宣言セキュリティを入れ子のクラスや入れ子のクラスのメソッドに適用するときも、それは親クラスには反映されません。宣言セキュリティを入れ子のクラスに適用するときは、別のクラスであるかのように適用する必要があります。
Main
というクラスのクラス レベルに要求された仮想のアクセス許可の例を次に示します。このクラスには、入れ子になった Nested
というクラスが定義されています。この例では、要求は入れ子のクラスには適用されていません。
<SomePermissionAttribute(SecurityAction.Demand, Unrestricted:=True)> _
Public Class Main
' This nested class is not influenced by the demand.
Public Class Nested
' This method is not influenced by the demand.
Public Sub MyMethod()
End Sub
End Class
End Class
[SomePermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
class Main
{
// This nested class is not influenced by the demand.
class Nested
{
// This method is not influenced by the demand.
public void MyMethod()
{
}
}
}