Как явно отбросить аргумент?

88
задан JAD 21 March 2018 в 18:22
поделиться

6 ответов

Необходимо объявить переменную, которую Вы тогда проигнорируете. Это обычно имеет место с TryParse (или TryWhatever) шаблон, когда это используется для тестирования законности ввода данных пользователем (например, это может быть проанализировано как число?), не заботясь о фактическом проанализированном значении.

Вы использовали слово, "располагают" в вопросе, который я подозреваю, было просто неудачно - но если параметр имеет тип, который реализует IDisposable, необходимо, конечно, звонить, Располагают, если документация метода явно не указывает, что получение значения не присуждает владение. Я не могу помнить когда-либо видеть метод с доступным out параметр, хотя, таким образом, я надеюсь, что это было просто неудачным выбором слов.

37
ответ дан Jon Skeet 24 November 2019 в 07:32
поделиться

К сожалению, Вы обязаны передавать что-то, потому что метод требуется установить его. Таким образом, Вы не можете отправить null, потому что метод, обязанность установила его, аварийно завершился бы.

Один подход для сокрытия уродства должен был бы обернуть метод в другой метод, который делает out, параметру для Вас нравится так:

String Other_MakeMyCall(String inputParams)
{
    String messages;

    return MakeMyCall(inputParams, out messages);
}

Тогда можно звонить Other_MakeMyCall, не имея необходимость играть с out параметры, в которых Вы не нуждаетесь.

36
ответ дан Andrew Hare 24 November 2019 в 07:32
поделиться

Если исходная функция объявляется как это:

class C
{
    public Result MakeMyCall(Object arg, out List<String> messages);
}

можно объявить дополнительный метод как это:

static class CExtension
{
    public static Result MakeMyCall(this C obj, Object arg)
    {
        List<String> unused;
        return obj.MakeMyCall(arg, out unused);
    }
}

дополнительный метод будет вести себя как перегрузка, которая делает параметр дополнительный.

11
ответ дан bmm6o 24 November 2019 в 07:32
поделиться

Компилятор Visual Basic делает это путем создания фиктивной переменной. C# мог сделать это, если можно убедить Microsoft, что это - хорошая идея.

4
ответ дан Jonathan Allen 24 November 2019 в 07:32
поделиться

Если класс messages реализации IDisposable, Вы не должны игнорировать его. Рассмотрите что-то как следующий подход (может не быть синтаксически корректным, так как я не записал C# в некоторое время):

using (FooClass messages) {
    myResult = MakeMyCall(inputParams, messages);
}

Однажды вне using блок, messages будет расположен автоматически.

0
ответ дан Sören Kuklau 24 November 2019 в 07:32
поделиться

Необходимо передать переменную для параметр. Вы не должны инициализировать переменную прежде, чем передать его:

MyMessagesType messages;
myResult = MakeMyCall(inputParams, out messages); 

Как правило, можно просто проигнорировать 'сообщения' после вызова - если потребности 'сообщений', располагающие по некоторым причинам, такие как использование ограниченных системных ресурсов, в этом случае, Вы не должны звонить, Располагают ():

messages.Dispose();

, Если это могло бы использовать существенное количество памяти и это собирается остаться в объеме некоторое время, это должно, вероятно, быть установлено в NULL, если это - ссылочный тип или к новому экземпляру по умолчанию, если это - тип значения, так, чтобы сборщик "мусора" мог исправить память:

messages = null; // Allow GC to reclaim memory for reference type.

messages = new MyMessageType(); // Allow GC to reclaim memory for value type.
0
ответ дан Joe Erickson 24 November 2019 в 07:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: