【问题标题】:Is it possible to use 'return' and 'out' the same time?是否可以同时使用'return'和'out'?
【发布时间】:2011-10-11 06:44:56
【问题描述】:

我有一个方法GetSelectedServices(),它从树列表中返回选定的节点, 期望以相同的方法返回选定的节点和我尝试添加的所有节点out 参数。

但是当我调用这个方法时,我应该给出 out 参数,所以返回的带有 selectedNodes 的列表被屏蔽了,我不能拥有它。

我的方法

internal List<__ServiceInfo> GetSelectedServices(out List<__ServiceInfo> lstAll)
{
    List<__ServiceInfo> lstSelected = new List<__ServiceInfo>();
    List<__ServiceInfo> lstA = new List<__ServiceInfo>();

    foreach (TreeListNode node in this.tlServices.Nodes)
    {
        if (node.Checked)
        {
            var service = this.tlServices.GetDataRecordByNode(node) as __ServiceInfo;
            lstA.Add(service);

            if (service != null)
            {
                lstSelected.Add(service);
            }

            if (node.Nodes.Count > 0)
            {
                foreach (TreeListNode subNode in node.Nodes)
                {
                    if (subNode.Checked)
                    {
                        service = this.tlServices.GetDataRecordByNode(subNode) as __ServiceInfo;
                        lstA.Add(service);

                        if (service != null)
                        {
                            lstSelected.Add(service);
                        }
                    }
                }
            }
        }
    }
    lstAll = lstA;

    return lstSelected;
}

我调用方法的方式

public bool HasValidModel()
{
    List<__ServiceInfo> lstAll = new List<__ServiceInfo>();
    //here I get all nodes
    var allServices = this.GetAllServices(out lstAll);

    List<__ServiceInfo> lstSelected = new List<__ServiceInfo>();
    //but how to get the list from  ""return lstSelected"";
}

感谢您的任何建议。

【问题讨论】:

  • 所以基本上,“all”包含选定的所有内容,然后是一堆null 条目?
  • 看来GetSelectedServices 正在为“全部”和“选定”返回相同的列表——假设service 永远不是null。如果有任何空值,那么你的结果就更奇怪了。
  • 您的程序违反了 C# 规范的第 2.4.2 节; 编写一个标识符中有两个连续下划线的程序是最糟糕的做法,除非您在框架或编译器的实现团队中。
  • @Eric:一般来说这是一个值得的做法吗?如果是这样,为什么你们内部有这个约定?只是好奇。我认为这是因为很难知道要为变量键入多少个下划线。
  • @JoanVenge:我们希望您避免在标识符中放置两个下划线,因为我们保留在未来通过创建包含两个下划线的新关键字来进行重大更改的权利。例如,__arglist 是 C# 的未记录关键字。如果我们决定在 C# 中创建一个保留 __ServiceInfo 的功能,那么这个问题中的代码将在重新编译时被破坏。为了您自己的安全,您应该避免使用任何包含 __ 的标识符。

标签: c# parameters return out


【解决方案1】:

您已经有两个变量,尽管您不必要地初始化其中一个。只需使用:

public bool HasValidModel()
{
    List<__ServiceInfo> lstAll;
    var selectedServices = this.GetAllServices(out lstAll);

    // Now use lstAll and selectedServices
}

我个人不太喜欢使用 out 参数,如果可能的话,我会寻找替代设计,但这是另一回事。 (我会将查找所有服务与选择其中一些服务分开。)

【讨论】:

    【解决方案2】:

    只需使用两个变量,如下所示:

    List<__ServiceInfo> lst;
    List<__ServiceInfo> lstSelected = GetSelectedServices(out lst);
    

    'return'ed 对象现在由lstSelected 引用,而outed 对象由lst 引用。

    【讨论】:

      【解决方案3】:

      您实现returnout 参数的方式似乎没问题。但是调用是错误的。 @Ken 的回答指向了正确的方向。

      但是GetSelectedServices 方法中的逻辑很奇怪。 “选择”服务和“常规”服务之间的唯一区别是“常规”服务是NULL。这导致allServices 列表是NULL 和所选服务的集合。在我看来这毫无意义。

      【讨论】:

        猜你喜欢
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-22
        • 2021-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多