Methods C#属性或代码检查注释,用于鼓励或阻止从虚拟方法重写调用基方法

Methods C#属性或代码检查注释,用于鼓励或阻止从虚拟方法重写调用基方法,methods,attributes,overriding,c#-6.0,rider,Methods,Attributes,Overriding,C# 6.0,Rider,我正在和莱德一起做一个C#项目 我有时会看到基类有一个空的虚方法,然后是一个重写该方法的派生类。即使基方法为空,方法重写也会显式调用base.MethodName() public class A { public virtual void Method1() { } public virtual void Method2() { // Important logic performed here! } } public class B : A

我正在和莱德一起做一个C#项目

我有时会看到基类有一个空的虚方法,然后是一个重写该方法的派生类。即使基方法为空,方法重写也会显式调用
base.MethodName()

public class A
{
    public virtual void Method1() { }

    public virtual void Method2()
    {
        // Important logic performed here!
    }
}

public class B : A
{
    public override void Method1()
    {
        base.Method();

        // Do something else ...
    }

    public override void Method2()
    {
        // Do something here ...
    }
}
在Rider的IL查看器中查看该方法时,即使该方法为空,也会包含对基本方法的调用

public class A
{
    public virtual void Method1() { }

    public virtual void Method2()
    {
        // Important logic performed here!
    }
}

public class B : A
{
    public override void Method1()
    {
        base.Method();

        // Do something else ...
    }

    public override void Method2()
    {
        // Do something here ...
    }
}
C#或Rider中是否有任何方法属性或代码检查注释可能:

  • 调用空基方法时生成编译器或代码检查警告

    public class A
    {
        public virtual void Method1() { }
    
        public virtual void Method2()
        {
            // Important logic performed here!
        }
    }
    
    public class B : A
    {
        public override void Method1()
        {
            base.Method();
    
            // Do something else ...
        }
    
        public override void Method2()
        {
            // Do something here ...
        }
    }
    
  • 当不调用非空的基方法时,生成编译器或代码检查警告

  • 例如:

    public class A
    {
        [OmitCallFromOverride]
        public virtual void Method1() { }
    
        [RequireCallFromOverride]
        public virtual void Method2()
        {
            // Important logic performed here!
        }
    }
    
    我可以想象这样一种场景:多个派生类重写一个方法,一个或多个派生类错误地未能调用基方法,这可能导致意外行为。或者存在对空基方法的不必要调用的情况,这可能是浪费,但不太可能破坏任何东西

    虽然我主要是询问是否存在这样的属性或代码检查注释,但我也很想知道人们可能如何处理这些情况,例如总是通过重写调用基本方法,将重要逻辑排除在基本虚拟方法之外,或者使用一些其他的通信方法来判断基本方法调用是不必要的还是必需的

    调用基时生成编译器或代码检查警告 方法,该方法为空

    public class A
    {
        public virtual void Method1() { }
    
        public virtual void Method2()
        {
            // Important logic performed here!
        }
    }
    
    public class B : A
    {
        public override void Method1()
        {
            base.Method();
    
            // Do something else ...
        }
    
        public override void Method2()
        {
            // Do something here ...
        }
    }
    
    据我所知,在c#中,对于空方法没有警告。因此,我认为在调用空的基方法时没有警告。
    但你可以自由为自己写一本:

    不调用基时生成编译器或代码检查警告 方法,该方法不是空的

    不是在C#中,我认为强制派生类调用基方法不是一个好主意。我可以理解,在您的场景中,如果您的所有派生类方法都始终调用基方法,那将是一件好事,但这将是一种非常罕见的情况。一般来说,当我们需要复杂的(非直观的)规则时,这意味着我们的解决方案不是很清楚,否则很容易出错

    将重要逻辑排除在基本虚拟方法之外

    如果您需要调用
    A.Method1
    ,也许让它作为
    虚拟的
    方法不是一个好主意。当您希望给派生类提供使用它的机会或用更适合的版本覆盖它的机会时,您有一个
    虚拟
    方法。
    我向您提出一个解决方案,也许您可以适应您的场景

    abstract class A
    {        
        public abstract void Method1();
    
        public virtual void Method2() { }
    
        public void MustBeCalled() 
        { 
            // Here you can put the logic you had in Method1, you need to execute this code, so this method can't be overwrited.             
        }
    
        public void TemplateMethod()
        {
            Method1();
            MustBeCalled();
            // Do something else ...
        }
    
    }