如果用户定义函数的静态调用顺序违反某些规则,使编译器报错

本文关键字:规则 编译器 函数 定义 用户 静态 顺序 调用 如果 | 更新日期: 2023-09-27 17:49:32

考虑下面的代码。

public class Class1
{
    public void ThisShouldNotCompileBecauseOrderWasVoilated()
    {
        Call2();
        Call1();
    }
    public void ThisShouldCompileBecauseProperOrderIsPresent()
    {
        Call1();
        Call2();
    }
    private void Call1()
    {
        // some code
    }
    private void Call2()
    {
        // some more code
    }
}

我应该在Call1()/Call2()中添加什么代码(或属性),以确保编译器抱怨第一个方法并传递第二个方法。如果顺序不正确,编译器将不得不引用一些规则列表。在本例中,规则列表可以说"Call1 Call2",这意味着在Call2()之前调用Call1()

这是c#语言的。net 4.0

谢谢!

如果用户定义函数的静态调用顺序违反某些规则,使编译器报错

在普通c#中没有什么可以指定的。

可能可以使用NDepend之类的东西来检测这个,但我不确定。

您可以创建自己的属性并使用它标记您的方法。然后创建一个FXCop规则。FXCop与您的构建过程完全集成,只要这两个调用发生在同一个方法中,规则应该很容易充实。

编译器不能强制方法调用顺序,因为在许多情况下它不能静态地确定调用顺序是什么。例如:

public void whichOrder(boolean b)
{
   if (b) call1();
   if (!b) call2();
   if (b) call2();
   if (!b) call1();
}

如果有必要以正确的顺序调用方法,您有几个选择:

  • 记录呼叫顺序,以便呼叫者知道该怎么做。这并没有强制执行顺序,但至少让编码人员意识到这一点。
  • 添加状态到您的对象,以记住哪个方法被最后调用,并验证当前被调用的方法是允许的。这将在运行时强制方法检查。
  • 使用模拟框架(例如Moq)对客户端进行单元测试。在构建时检查顺序是否正确。

选择哪种方法取决于正确的顺序有多重要,以及以错误顺序调用方法的后果。

另一种选择是重新设计,这样方法排序就不会成为问题。例如,将这两个方法包装在第三个call3()中,该方法以正确的顺序调用call1()和call2()。或者,如果call1()还没有执行,让call2()调用call1(),并让call1()检查它是否已经运行,如果不需要运行,则静默返回。如果客户端调用call2(),然后调用call1(),您仍然在内部首先获得call1()的效果(从call2()对call1()的内部调用),并且客户端调用call1()导致没有操作。

public void call3()
{
    call1();
    call2();
}

public void call2()
{
   call1();
   // rest of call2's logic
}
private boolean call1Called = false;
pubic void call1()
{
   if (!call1Called)
   {
      call1Called=true;
      call1Impl();
   }
}

这不是你想要的…但是你可以引入另一个类:

public class Another1
{
    public Another2 Call1()
    {
        // some code
        return new Another2();  
        // could pass 'this' to Another2 constructor so it has all state
    }
}
public class Another2
{
    public void Call2()
    {
        // some more code
    }
}

现在,从Another1的实例开始,您只能执行obj.Call1().Call2()而不能执行obj.Call2().Call1()。更好的是,当您键入时,这种强制在IDE中执行。看一下"流畅"模式