문제

나는 전화를하고있다 :

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 (또는 trywhate) 패턴의 경우에, 실제 구문 분석 값을 돌보지 않고 사용자 입력의 유효성을 테스트하는 데 사용될 때 (예 : 숫자로 구문 분석 할 수 있습니까?)의 경우입니다.

질문에서 "dispose"라는 단어를 사용했습니다. 불행한 것으로 생각됩니다. 그러나 out 매개 변수가 idisposable을 구현하는 유형이라면, 메소드 문서가 값을 수신하지 않는다고 명시 적으로 명시하지 않으면 분명히 호출해야합니다. 소유권. 일회용 방법이있는 방법을 본 적이 없습니다. out 그러나 매개 변수, 그래서 나는 이것이 단지 불행한 단어의 단어를 선택하기를 바라고 있습니다.

불행히도 방법을 설정해야하기 때문에 무언가를 전달해야합니다. 그래서 당신은 보낼 수 없습니다 null 이 방법이 설정 해야하는 방법은 폭발 할 것입니다.

추악함을 숨기는 한 가지 접근법은 방법을 다른 방법으로 랩핑하는 것입니다. out 좋아하는 매개 변수 :

String Other_MakeMyCall(String inputParams)
{
    String messages;

    return MakeMyCall(inputParams, out messages);
}

그런 다음 전화 할 수 있습니다 Other_MakeMyCall 함께 바이올린없이 out 필요하지 않은 매개 변수.

원래 함수가 다음과 같이 선언 된 경우 :

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 차단하다, messages 자동으로 배치됩니다.

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.

이 경우 나는 삭제 또는 제거 방법이없는 동시 소설을위한 일반적인 확장 방법을 만들었습니다.

//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