c# 如何结束函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# 如何结束函数相关的知识,希望对你有一定的参考价值。

private void test()

...
if(a==1)

结束函数...这里代码怎么写?后续的代码不需要运行

...

Process类的CloseMainWindow, Kill, Close
Process.CloseMainWindow是GUI程序的最友好结束方式,从名字上就可以看出来它是通过结束主窗体,相当于用户点击窗体的关闭按钮或者按Alt + F4。它的本质就是向主窗体发送WM_CLOSE消息(Process.MainWindowsHandle可以返回主窗体的句柄)。这个可以在.NET Framework源代码中看出来:
publicbool CloseMainWindow()

IntPtr mainWindowHandle =this.MainWindowHandle;
//句柄是否为0
if (mainWindowHandle ==IntPtr.Zero)

returnfalse;

//GetWindowLong是否成功执行
if ((NativeMethods.GetWindowLong(newHandleRef(this, mainWindowHandle), -16) &0x8000000) !=0)

returnfalse;

//0x10 是 WM_CLOSE消息
//向主窗体发送WM_CLOSE,注意是PostMessage而不是SendMessage
NativeMethods.PostMessage(newHandleRef(this, mainWindowHandle), 0x10, IntPtr.Zero, IntPtr.Zero);
returntrue;


CloseMainWindow方法使用PostMessage(不是SendMessage,所以消息会加在消息队列的最后)方法向主窗体发送一个WM_CLOSE消息,这样等主窗体处理完所有消息后,等遇到WM_CLOSE便开始执行退出动作。
比如记事本接到了WM_CLOSE消息但是有未保存的文件记事本会弹出对话框提示用户保存还是不保存还是取消退出操作。Windows Forms和WPF的窗体都会有类似操作,通过窗体的Closing事件来在WM_CLOSE消息接收后做出是否退出的决定。

之后我们会讲到Windows Forms和WPF都有自己的友好型常规退出方式,但是其实有一个通用的GUI程序退出方式,就是利用这个CloseMainWindow方法:
//Windows Forms和WPF都可以用
//Windows Forms的Form.Closing事件会在之后发生
//WPF的Windows.Closing事件也会
Process.GetCurrentProcess().CloseMainWindow();

接下来就是Process.Kill方法,从名字也可以看出来,直接杀掉,不给喘息喘息机会呵呵。Kill方法会直接结束整个进程,不进行常规资源清理(什么finally块等……)。Kill本质调用本地API:TerminateProcess函数。

最后一个是Process.Close方法。抱歉它根本不是用来结束进程的!这个方法名字有些误导,其实根本则不然。它仅仅是而是IDisposable的Dispose方法的具体执行,用来进行Process类的托管资源清理的!
由于Process类继承自Component类,后者继承IDisposable而同时又有析构函数,而通过一个继承类可改写的Dispose方法(参数是bool disposing)来判断这个Dispose是用户调用还是GC调用。而这个Process.Close()方法正是用户调用Dispose时进行托管资源的清理方法:
下面Process.Dispose方法代码:
protectedoverridevoid Dispose(bool disposing)

if (!this.disposed)

if (disposing)

//用户调用,清理托管资源
this.Close();

this.disposed =true;
//调用Component的Dispose
base.Dispose(disposing);



这个Close方法类似很多其他.NET中的类,比如Stream……因此Close肯定不会结束进程,仅仅是Process类作为IDisposable接口的间接继承者的自我清理方法。

Environment类的Exit和FailFast
Environment.Exit相当于在Main函数中的return指令。不过它不会执行代码块的finally块(如果有的话),但资源清理还是要进行的。

它是最常见的退出当前进程的方法之一。在Main函数中我们可以直接return语句便退出了程序。如果不在Main函数内,那么Environment.Exit方法就可以派上用场:
classa

~a()

Console.WriteLine("析构函数");


classProgram

staticvoid Main()

try

a oa =newa();
test();

finally

//这段代码永远不会执行
Console.WriteLine("finally");



staticvoid test()

Environment.Exit(0);



代码将会输出:
析构函数
看来GC调用了oa的析构函数,但注意finally块没有运行。

Environment.FailFast方法更速度,它甚至不需要向操作系统返回进程退出代码(ExitCode),直接结束当前进程并在应用程序事件薄中写入信息,用于程序出现致命错误需要立即停止。
classa

~a()

Console.WriteLine("析构函数");


classProgram

staticvoid Main()

try

a oa =newa();
Environment.FailFast("致命错误发生!");

finally

//这段代码永远不会执行
Console.WriteLine("finally");




在.NET 4.0下,Environment.FailFast代码会抛出FatalExecutionEngineError,而在4.0之前会抛出ExecutionEngineException。但都不会有任何输出(GC没有清理对象,同时finally块也没有运行)
参考技术A private void test()

...
if(a==1)

return;

...

如果方法有返回值的话
private int test()

int n = 0;
...
if(a==1)

return n;

...
参考技术B return;本回答被提问者采纳

C#函数复习

1 函数

对不同的数据执行相同的操作。

2 Main()函数

是应用程序的入口函数点,当运行C#程序的时候就会调用它包含的入口点函数,这个函数执行完毕,程序就终止了,所以所有程序都必须有一个入口点。


3 返回值是有数据类型的,void关键字无返回值
4 结束函数执行是return,意思就是把返回值传送给调用函数的变量。

练习:

无参、无返回值的函数:

 

class MyClass
{
    static void Show()
    {
        Console.WriteLine("function");
    }

    static void Main()
    {
        Show();  //调用函数
        Console.ReadKey();
    }
}

 

参数:

class MyClass
{
    static void Show(string str)
    {
        Console.WriteLine("is " + str);
    }

    static void Main()
    {
        show("function");  //调用函数
        Console.ReadKey();
    }
}

返回值:

 

class MyClass
{
    static string Show(string str)
    {
        return "is " + str;
    }

    static void Main()
    {
        string s = Show("function");//调用函数
        Console.WriteLine(s);  
        Console.ReadKey();
    }
}

函数见 return 就返回:

class MyClass
{
    static int Math(int x, int y)
    {
        return x + y;
        return x * y; /* 执行不了这句 */
    }

    static void Main()
    {
        Console.WriteLine(Math(3,4)); //7
        Console.ReadKey();
    }
}

引用参数和输出参数:

class MyClass
{
    static void proc1(ref int num)
    {
        num = num * num;
    }

    static void proc2(out int num)
    {
        num = 100;
    }

    static void Main()
    {
        int a = 9;
        proc1(ref a);  /* 引用参数(ref) 参数必须是已初始化的 */
        Console.WriteLine(a); //81

        int b;
        proc2(out b);  /* 输出参数类似 ref(但初始化不是必要的), 是从函数中接出一个值来 */
        Console.WriteLine(b); //100

        Console.ReadKey();
    }
}

 

 

 

 

 

 

 

以上是关于c# 如何结束函数的主要内容,如果未能解决你的问题,请参考以下文章

p/invoke 操作以执行另一个函数结束

C#函数复习

C# WPF WebBrowser控件调用Refresh()函数出现异常,导致程序“未响应”并无法继续运行

2017-3-5 C#基础 函数--递归

C#中如何动态加载和卸载DLL

c#的main怎么调用