如果用户定义函数的静态调用顺序违反某些规则,使编译器报错
本文关键字:规则 编译器 函数 定义 用户 静态 顺序 调用 如果 | 更新日期: 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中执行。看一下"流畅"模式