繁体   English   中英

如何在 c# 中退出非 void 方法

[英]How to exit a non void method in c#

我有一个返回ItemCollection的方法,如果没有提供信息,我想尽早停止 function 。 我通常会通过退货来做到这一点; 但是,由于我的方法需要一个ItemCollection它失败了。 我有这个作为解决方法,但坦率地说,它似乎很老套。 有什么我想念的吗。 我试着返回; 我宁愿不抛出异常。

    private ItemCollection loadLeft_Click(object sender, RoutedEventArgs e)
    {

        var leftUser = UsrLeft.Text;
        if (leftUser == "")
        {
            MessageBox.Show("No User Entered");
            GroupListLeft.Items.Add("");
            var fail = GroupListLeft.Items;

            return fail;
        }

        //Succesful test do stuff 
        var leftItems = GroupListLeft.Items;

        return leftItems;
     }

你有几个选择:

  • 抛出一个新的Exception (甚至可能是像NoUserEnteredException("someText")这样的自定义异常)。
  • 返回null
  • 返回一个空集合或虚拟 object(请参阅空对象模式)

最后一个是更好的选择,在这种情况下,您不需要在客户端代码中编写空检查或 try-catch 部分。

您将需要返回 null,例如

private ItemCollection loadLeft_Click(object sender, RoutedEventArgs e)
{

    var leftUser = UsrLeft.Text;
    if (leftUser == "")
    {
        MessageBox.Show("No User Entered");

        return null;
    }

    //Succesful test do stuff 
    var leftItems = GroupListLeft.Items;

    return leftItems;
 }

您将需要返回等同于ItemCollection的内容,具体取决于您可能希望调用过程如何处理此类返回,您可以使用null返回:

    if (leftUser == "")
    {
        MessageBox.Show("No User Entered");
        return null;
    }

或者返回一个新的ItemCollection例如

    if (leftUser == "")
    {
        MessageBox.Show("No User Entered");
        return new ItemCollection();
    }

您可以使用我不时使用的“return null”,但这不是一个好的编码约定。 另一种选择是抛出异常然后捕获它。 两者都是糟糕的编码约定,并且使使用此按钮的代码添加了一些相当模糊的逻辑和依赖关系。

通过研究 SOLID 原理,我认为更好的解决方案是让新型 object 返回。 前任一个包含一个列表,还有一个状态消息,然后让它的反应有点像当你有一个取决于成功的 HTTP 请求时,否则不能期望有任何内容。 通过这种方式,object 更清楚地说明了预期。

第四个选项,因为这听起来与 UI 相关,所以可能有点击回调以某种方式更新集合,或者直接更新错误消息。 但这也可能是一个糟糕的编码约定,在代码中具有不切实际的依赖关系。

当您单击某些内容时,您的代码似乎返回 object。 (我不是 WPF 方面的专家,我不知道这是否可能)。

我会将 function 封装在单独的 function 中返回ItemCollection ,并在调用此 function 之前检查用户是否有效。

这样可以确保ItemCollection始终有效(因为您甚至不会尝试使用无效用户检索它)。 像这样的东西:

    private void loadLeft_Click(object sender, RoutedEventArgs e) {
        var leftUser = UsrLeft.Text;
        if(leftUser != "") {
            ItemCollection coll = getItemCollectionForUser(leftUser);
        }else {
            //Error Handling
        }
    }

    private ItemCollection getItemCollectionForUser(string user) {
       //return ItemCollection here
    }

请注意我是如何编写一个单独的 function 来返回ItemCollection的,而Click function 什么也不返回。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM