gpt4 book ai didi

c# - 继承SafeHandle时,我们是否应该重新应用ReliabilityContract属性?

转载 作者:太空宇宙 更新时间:2023-11-03 11:47:19 25 4
gpt4 key购买 nike

.Net security blog article在 SafeHandles 上,它提到您需要将 ReliabilityContract 属性应用于关闭句柄的 native 方法的签名。

当我们从 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 有 its inherited property set to false - 我认为这意味着我们覆盖的方法将不再具有属性 - 那么,我们是否需要重新应用该属性?

最佳答案

是的,您必须重新应用该属性,因为 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());
}
}
}

关于c# - 继承SafeHandle时,我们是否应该重新应用ReliabilityContract属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3077329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com