返回后或返回前的触发代码
本文关键字:返回 代码 | 更新日期: 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");
}
}
}
希望这能帮助