Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用void方法而不是bool()实现早期返回(或重写返回)_C#_Design Patterns_Overriding_New Operator - Fatal编程技术网

C# 如何使用void方法而不是bool()实现早期返回(或重写返回)

C# 如何使用void方法而不是bool()实现早期返回(或重写返回),c#,design-patterns,overriding,new-operator,C#,Design Patterns,Overriding,New Operator,为了避免使用Booleanreturn-type方法,我尝试执行类似于下面代码的操作,但我找不到任何正确实现它的方法: public void myMethod(int someInitializingParameter) { //return (kinda override operator) if(TargetObjToinitItsProperties == null) MsgDbgWin

为了避免使用
Boolean
return-type方法,我尝试执行类似于下面代码的操作,但我找不到任何正确实现它的方法:

public void myMethod(int someInitializingParameter)
{
                                              //return (kinda override operator)
     if(TargetObjToinitItsProperties == null) MsgDbgWinShow("Error: Line#637-xxx.CS", "Property was accessed prior to parent object init");
     TargetObjToInitItsProperties.IntProp1 = someInitializingParameter;
}

static void MsgDbgWinShow(string Wtitle, string Wmsg)
{
   create a window (windowsTitle=Wtitle .. size width ...create TextBlock.Content= Wmsg...etc')

   CreatedWindow.Show();
//here is self exit and return ...from self but will not act as return operator...
}

是否有任何方法将void用作返回类型而不是使用类型?

您只需抛出一个异常并在调用者中捕获它即可。 这将方法保留在“抛出”的位置:

    public void myMethod(int someInitializingParameter)
    {
        //return (kinda override operator)
        if(TargetObjToinitItsProperties == null)
            throw new Exception("Property was accessed prior to parent object init");

        TargetObjToInitItsProperties.IntProp1 = someInitializingParameter;
    }
您甚至可以在继承时创建自己的异常类型。然后您可以输入一些额外的数据:

class MyException : Exception
{
    // some enhancements
    public string ExtraData;

    public MyException(string sMessage, string sExtraData)
        : base(sMessage)
    {
        ExtraData = sExtraData;
    }
}
    public void CallingMethod()
    {
        try
        {
            myMethod(23);
        }
        catch (MyException e)
        {
            Console.WriteLine(e.Message + e.ExtraData);
        }
    }
现在你可以扔了:

    public void myMethod(int someInitializingParameter)
    {
        //return (kinda override operator)
        string sExtraData = "Hallo";
        if (TargetObjToinitItsProperties == null)
            throw new MyException("Property was accessed prior to parent object init",
                                  sExtraData);

        TargetObjToInitItsProperties.IntProp1 = someInitializingParameter;
    }
在调用者中,您可以捕获它并使用额外的数据:

class MyException : Exception
{
    // some enhancements
    public string ExtraData;

    public MyException(string sMessage, string sExtraData)
        : base(sMessage)
    {
        ExtraData = sExtraData;
    }
}
    public void CallingMethod()
    {
        try
        {
            myMethod(23);
        }
        catch (MyException e)
        {
            Console.WriteLine(e.Message + e.ExtraData);
        }
    }

返回有什么问题?在我还没有尝试过的领域,这听起来是一个不错的选择,只是(仔细想想)使用
Exception
而不是一个简单的方法会不会很昂贵,或者我打开的窗口的成本不会更低?或者我错过了将
try catch
与Exception混合在一起吗(我曾读到,异常处理很昂贵,或者只尝试捕获…)没问题,异常并不昂贵。如果你想显示一个消息框,我会在你捕获它的调用者那里这样做。我使用异常很多年了,而且我从来没有想过它属于性能。顺便说一句,异常是所有.net类的内置标准方式。在我的方法中,我可以当不处于编码调试模式时,父方法将在“Msgbxwindow”和登录文件之间进行选择。。。