返回后或返回前的触发代码

本文关键字:返回 代码 | 更新日期: 2023-09-27 18:21:38

如何在调用return之前/之后执行代码的某些部分。例如,在一个方法中可能多次调用return,因此我不希望在return之前复制粘贴相同的行。

我可能错了,但有些人告诉我,try块会使代码运行缓慢,我的方法被调用了1000多次,因此即使这个任务可以通过try/finaly块来完成,我也希望避免它

示例:

void method()
{
 MyObject activator = new ...
 AnotherObject something = new ...
 SomethingElse asdf = new ...
 // some other variables 
 if(..)
    // Deactivate activator, close things, confirm user exited
    // Do some post calculations
   return;
 if(..)
    // Deactivate activator, close things, confirm user exited
    // Do some post calculations
   return;
 if(..)
    // Deactivate activator, close things, confirm user exited
    // Do some post calculations
  return;
}

现在,我需要在每次返回之前或之后执行相同的代码。我的代码需要使用方法顶部定义的变量,这就是我不能外包的原因。如何做到这一点?有办法吗?如有重复,我深表歉意。

返回后或返回前的触发代码

我不太清楚你想要实现什么,但根据你的帖子,你可以使用可怕的goto语句!

public void Test()
{
    if (...)
        goto Finish;
    if (...)
        goto Finish;
    
    Finish:
    DoSomething();  
}

根据您的更新,我肯定会考虑使用finally块:

void Main()
{
    try 
    {
     MyObject activator = new ...
     AnotherObject db_connection = new ...
     Proxy p = new ...
     // some other variables 
     if(..)
      return;
     if (...)
        return;
    }
    finally
    {
        // Deactivate activator, close db connection, call a webservice to confirm user exited
        // Do some post calculations
    }
}

最终尝试的效率

最终尝试模式非常有效。考虑以下代码:

try
{
    Console.WriteLine("Foo");
}
finally
{
    Console.WriteLine("Bar");
}

这将编译为以下IL:

IL_0000:  ldstr       "Foo"
IL_0005:  call        System.Console.WriteLine
IL_000A:  leave.s     IL_0017
IL_000C:  ldstr       "Bar"
IL_0011:  call        System.Console.WriteLine
IL_0016:  endfinally  

在英语中是:

加载字符串";Foo";并用它调用WriteLine。我们有一个finally语句,所以当我们调用它时,转到位置IL_0017——方法的末尾。加载字符串";条形图";并用它调用WriteLine。finally现在已经完成,所以我们可以继续到finally块之前定义的位置。

也许可以考虑一个try-filly构造。它用于可以引发异常的代码路径,但仍必须始终进行清理(即使在引发异常之后)。

http://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx

void method() {
     MyObject activator = new ...
     AnotherObject db_connection = new ...
     Proxy p = new ...
     try{
         // some other variables 
         if(..)
            // Do some post calculations
         if(..)
            // Do some post calculations
         if(..)
            // Do some post calculations
    }
    finally{
        // Deactivate activator, close db connection, call a webservice to confirm user exited
    }
      return;
}

//更新

我想知道,如果try/finaly的性能太高,以至于破坏了应用程序,您是否不应该重新设计应用程序或代码路径。你似乎在很短的时间内打开和关闭了1000多次连接。这是到1000多个数据库的连接,还是1000多个用户连接到一个数据库?为什么不把它打开?你能分享一些关于这个用例的其他细节吗?

我还不清楚你在找什么。但我所理解的是。你想实例化几个有值的对象,一旦完成,你想在退出方法之前处理/断开它们

以下是我对控制台应用程序的尝试,您可以在Disposed()方法中处理/断开您的值。

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Callmethod();
            Console.WriteLine("--------------------");
            Console.WriteLine("Disposed");
            Console.ReadKey();
        }
        private static string Callmethod()
        {
            using (MyObject obj = new MyObject())
            {
                Console.WriteLine(obj.strTest);
                Console.WriteLine("..");
                Console.WriteLine("..");
                Console.WriteLine("..");
                Console.WriteLine("..");
                return obj.strTest;
            }
        }
    }
    public class MyObject : IDisposable
    {
        public string strTest { get; set; }
        public MyObject()
        {
            strTest = "Intantiated";
        }
        public void Dispose()
        {
            Console.WriteLine("Disposing");
        }
    }
}

希望这能帮助