Вопрос

Я звоню:

myResult = MakeMyCall(inputParams, out messages);

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

Есть ли способ сделать что-то подобное с выходом или мне нужно объявить переменную, которую я затем проигнорирую?

Это было полезно?

Решение

Начиная с C # 7.0, можно избежать предварительного выделения параметров, а также игнорировать их.

public void PrintCoordinates(Point p)
{
    p.GetCoordinates(out int x, out int y);
    WriteLine($"({x}, {y})");
}

public void PrintXCoordinate(Point p)
{
    p.GetCoordinates(out int x, out _); // I only care about x
    WriteLine($"{x}");
}

Источник: https : //blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/

Другие советы

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

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

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

Один из способов скрыть уродство - заключить метод в другой метод, который для вас имеет параметр out:

String Other_MakeMyCall(String inputParams)
{
    String messages;

    return MakeMyCall(inputParams, out messages);
}

Затем вы можете позвонить Other_MakeMyCall без необходимости использовать <=> параметры, которые вам не нужны.

Если исходная функция объявлена ​​следующим образом:

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

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

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

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

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

После выхода из блока using <=> будет удален автоматически.

Вы должны передать переменную для параметра out. Вам не нужно инициализировать переменную перед ее передачей:

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

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

messages.Dispose();

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

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

messages = new MyMessageType(); // Allow GC to reclaim memory for value type.

В этом случае я создал универсальный метод расширения для ConcurrentDictionary, который не имеет метода Delete или Remove.

//Remove item from list and ignore reference to removed item
public static void TryRemoveIgnore<K,T>(this ConcurrentDictionary<K,T> dictionary, K key)
{
    T CompletelyIgnored;
    dictionary.TryRemove(key, out CompletelyIgnored);
}

При вызове из экземпляра ConcurrentDictionary:

ClientList.TryRemoveIgnore(client.ClientId);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top