C# 是否可以使用';返回';和';输出';同时?

C# 是否可以使用';返回';和';输出';同时?,c#,parameters,return,out,C#,Parameters,Return,Out,我有一个方法GetSelectedServices(),它从树列表中返回所选节点, 我试图添加一个out参数,希望使用相同的方法返回所选节点和所有节点 但是当我调用这个方法时,我应该给出out参数,所以返回的包含selectedNodes的列表被屏蔽了,我不能拥有它 我的方法 internal List<__ServiceInfo> GetSelectedServices(out List<__ServiceInfo> lstAll) { List<__Se

我有一个方法
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"";
}
内部列表GetSelectedServices(外部列表lstAll)
{
List lstSelected=新列表();
List lstA=新列表();
foreach(此.tlServices.Nodes中的TreeListNode节点)
{
如果(节点已选中)
{
var service=this.tlServices.GetDataRecordByNode(节点)as\uuuu ServiceInfo;
lstA.Add(服务);
if(服务!=null)
{
选择。添加(服务);
}
如果(node.Nodes.Count>0)
{
foreach(node.Nodes中的TreeListNode子节点)
{
如果(选中子节点)
{
service=this.tlServices.GetDataRecordByNode(子节点)作为_userviceinfo;
lstA.Add(服务);
if(服务!=null)
{
选择。添加(服务);
}
}
}
}
}
}
lstAll=lstA;
返回选定的列表;
}
我调用方法的方式

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"";
}
public bool HasValidModel()
{
List lstAll=新列表();
//这里是所有节点
var allServices=this.GetAllServices(out-lstAll);
List lstSelected=新列表();
//但是如何从“return lstSelected”获取列表;
}

谢谢您的建议。

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

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

    // Now use lstAll and selectedServices
}
public bool HasValidModel()
{
清单1;
var selectedServices=this.GetAllServices(out-lstAll);
//现在使用lstAll和selectedServices
}

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

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

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

“return”ed对象现在由
lstSelected
引用,而
out
ed对象由
lst
引用,您实现
return
out
参数的方式似乎很好。但这个电话是错误的@肯的回答指向了正确的方向


然而,
GetSelectedServices
方法中的逻辑是奇怪的。“选定”服务和“常规”服务之间的唯一区别是“常规”服务为
NULL
。这导致
allServices
列表是空值加上所选服务的集合。这在我看来毫无意义。

所以基本上,“all”包含selected中的所有内容,然后是一堆
null
条目?似乎
GetSelectedServices
为“all”和“selected”返回相同的列表-假设
service
从不为
null
。如果存在任何空值,那么您的结果就更奇怪了。您的程序违反了C#规范的第2.4.2节;编写一个标识符中有两个连续下划线的程序是最糟糕的做法,除非您是框架或编译器的实现团队成员。@Eric:一般来说,这是值得一试的做法吗?如果是这样的话,为什么你们内部有这样的惯例?只是好奇。我想这是因为它使我们更难知道一个变量要键入多少下划线。@JoanVenge:我们希望您避免在标识符中添加两个下划线,因为我们保留将来通过创建包含两个下划线的新关键字来进行重大更改的权利。例如,
\uuu arglist
是C#的一个未记录关键字。如果我们决定使用C#的一个特性,即保留的
\uu ServiceInfo
,那么这个问题中的代码将在重新编译时被破坏。为了您自身的安全,您应该避免使用任何带有
\uuuuu
的标识符。