你好,這個問題可能很愚蠢。有沒有什麼辦法可以在調用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'中檢查? –
是否需要調用?或者在打電話給對方之前。 –