문제
나는 전화를하고있다 :
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);