Должны ли мы повторно применять атрибут ReliabilityContract при наследовании от SafeHandle? - PullRequest
2 голосов
/ 20 июня 2010

В статье блога .Net по безопасности о SafeHandles упоминается, что вам необходимо применить атрибут ReliabilityContract к сигнатуре собственного метода, который закрывает дескриптор.

Когда мы наследуемиз SafeHandle мы должны объявить конструктор, метод ReleaseHandle и свойство IsInvalid, для каждого из которых в базовом классе применяется ReliabilityContract (я использовал Reflector, чтобы взглянуть на SafeHandle):

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
protected SafeHandle(IntPtr invalidHandleValue, bool ownsHandle);

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
protected abstract bool ReleaseHandle();

public abstract bool IsInvalid { [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] get; }

ReliabilityContract имеет его унаследованное свойство установлено в false - что, я думаю, означает, что методы, которые мы переопределяем, больше не будут иметь атрибута - так, нам нужно повторно применить атрибут?

1 Ответ

2 голосов
/ 29 октября 2011

Да, вы должны повторно применить атрибут, потому что у ReliabilityContract его унаследованное свойство установлено в false, и это означает, что методы в производных классах не будут применять атрибут.

Посмотрите на приведенный ниже код. Если вы установите для именованного параметра Inherited значение false, для метода Method1 в производном классе атрибут не будет применен. После этого установите тот же параметр (Inherited) на true и запустите его снова.

[AttributeUsage(AttributeTargets.Method, Inherited=false)]
public class MyAttribute : Attribute { }

class BaseClass
{
    [My] // MyAttribute applied to base class
    public virtual void Method1() { }
}

class DerivatedClass : BaseClass
{
    // MyAttribute not applied to derivate class
    public override void Method1() { }
}

public class Program
{
    static void Main(string[] args)
    {
        var attributes = typeof(DerivatedClass)
            .GetMethod("Method1")
            .GetCustomAttributes(true);

        foreach (var attr in attributes)
        {
            Console.Write(attr.ToString());
        }
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...