你好,这个问题可能很愚蠢。有没有什么办法可以在调用method2之前调用method1来强制c#
但仍然有任何实现先决条件的方法作为另一种方法的方法。我正在使用Visual Studio(可能无关紧要)。
例子:
public void method1()
{
//Method 1
}
public void method2()
{
//Should call this only after calling method1
}
你好,这个问题可能很愚蠢。有没有什么办法可以在调用method2之前调用method1来强制c#
但仍然有任何实现先决条件的方法作为另一种方法的方法。我正在使用Visual Studio(可能无关紧要)。
例子:
public void method1()
{
//Method 1
}
public void method2()
{
//Should call this only after calling method1
}
想到的最简单的事情是从方法2.执行方法一:
public void method1()
{
//Method 1
}
public void method2()
{
method1();
// The rest of method2 code goes here...
}
你为什么要保留'method1'' public'? – Sefe
@Sefe:因为可能需要调用它而不调用method2。我不可能知道这个问题,所以我把它公开了。 –
有几种方法可以做到这一点:
代码契约:
如果您使用Microsoft's Code Contract Extensions,您可以设置在method1
一个标志,你可以要求method2
private bool hasRunMethod1 = false;
public void method1()
{
Contract.Ensures(this.hasRunMethod1);
//Method 1
hasRunMethod1 = true;
}
public void method2()
{
Contract.Requires(this.hasRunMethod1);
//Should call this only after calling method1
}
代码合同的主要优点相比,在代码中直接检查hasRunMethod1
是,静态检查可以检查在编译时的前提条件。给静态检查器method1
一个暗示定义了一个Ensures
的后置条件。
模板方法:
如果你不想使用代码合同或(如果您的Visual Studio版本不允许它为例),你可以不使用它们,您可以使用the template method pattern。这可能只会在特定的情况下,虽然工作:
abstract class Base {
private void method1()
{
//Method 1
}
private void method2()
{
//Method 2
}
protected abstract void BetweenMethod1And2();
public void RunTemplateMethod() {
method1();
BetweenMethod1And2();
method2();
}
}
你需要从Base
派生并实现BetweenMethod1And2
的中间代码。
私人令牌:
另一种选择是让method1
回报的令牌method2
需求,但只有它可以提供。你会虽然需要确保只有method1
可以用私有实现抽象类的实现它,例如:
abstract class Token {};
class EncapsulatingClass {
private class PrivateToken : Token {};
public Token method1()
{
//Method 1
return new PrivateToken();
}
public void method2(Token token)
{
if ((token as PrivateToken) == null) {
throw new ArgumentException();
}
//Method 2
}
}
正如已经建议上面可以从第一个方法本身的调用第二种方法。请注意,如果您希望仅为某些特定目的调用第二种方法,则可以使用条件运算符(如果等),并按照您的要求调用method2。希望这会帮助你。
为什么不从内部调用'method1()'?或者调用'method1'后将'bool'变量设置为true,并在'method2'中检查? –
是否需要调用?或者在打电话给对方之前。 –