Можно ли использовать ‘return’ и ‘out’ одновременно?

#c# #parameters #return #out

#c# #параметры #Возврат #out

Вопрос:

У меня есть метод GetSelectedServices() , который возвращает выбранные узлы из древовидного списка, ожидая возврата с помощью того же метода выбранных узлов и всех узлов, которые я пытался добавить out параметр.

Но когда я вызываю этот метод, я должен указать параметр out, и поэтому возвращаемый список с выбранными узлами замаскирован, и я не могу его получить.

Мой метод

 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"";
}
  

спасибо за любые предложения.

Комментарии:

1. Итак, по сути, «все» содержит все в selected, а затем кучу null записей?

2. Похоже, что GetSelectedServices возвращается один и тот же список как для «всех», так и для «выбранных» — при условии, что service это никогда null не будет . Если есть какие-либо нули, то ваши результаты будут еще более странными.

3. Ваша программа нарушает раздел 2.4.2 спецификации C #; наихудшей практикой является написание программы с двумя последовательными символами подчеркивания в идентификаторе, если вы не входите в команду разработчиков фреймворка или компилятора.

4. @Eric: Стоит ли вообще практиковать? Если да, то почему у вас, ребята, есть это внутреннее соглашение? Просто любопытно. Я предполагаю, что это связано с тем, что это затрудняет определение количества символов подчеркивания для переменной.

5. @JoanVenge: Мы хотим, чтобы вы никогда не помещали две нижние панели в идентификатор, потому что мы оставляем за собой право вносить кардинальные изменения в будущем, создавая новые ключевые слова, в которых есть две нижние панели. Например, __arglist это недокументированное ключевое слово C #. Если бы мы когда-нибудь решили создать функцию C #, которая зарезервирована __ServiceInfo , код в этом вопросе был бы поврежден при перекомпиляции. Для вашей собственной безопасности вам следует избегать создания любого идентификатора, который __ в нем есть.

Ответ №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 , в то время out как на объект ed ссылается lst .

Ответ №3:

Способ, которым вы реализовали параметр return и out параметр, кажется, в порядке. Но вызов неверен. ответ @Ken’s указывает в правильном направлении.

Однако логика в GetSelectedServices методе странная. Единственная разница между «выбранной» службой и «обычной» службой заключается в том, что «обычная» служба есть NULL . Что приводит к тому, что allServices список представляет собой набор нулей плюс выбранные службы. На мой взгляд, это не имеет смысла.