有没有办法在c#中调用method2之前强制调用method1

时间:2016-12-25 07:44:28

标签: c# visual-studio

你好这个问题可能很傻。

但仍然有任何方法可以将先决条件作为另一种方法的方法来实现。我正在使用Visual studio(可能没关系)。

示例:

 public void method1()
 {
     //Method 1
 }

 public void method2()
 {
      //Should call this only after calling method1
 }

3 个答案:

答案 0 :(得分:3)

有几种方法可以实现这一目标:

代码合同:

如果您使用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
    }
}

答案 1 :(得分:2)

最简单的想法是从method2执行method1:

public void method1()
{
    //Method 1
}

public void method2()
{
     method1();
     // The rest of method2 code goes here...
}

答案 2 :(得分:0)

如上所述,您可以在第一个方法中调用第二个方法。请注意,如果您只想为某些特定目的调用第二种方法,可以使用条件运算符(如果等等)并根据您的要求调用method2。希望这会帮助你。