out 인수를 명시 적으로 버리는 방법은 무엇입니까?
전화를 겁니다.
myResult = MakeMyCall(inputParams, out messages);
하지만 실제로는 메시지에 신경 쓰지 않습니다. 입력 매개 변수라면 신경 쓰지 않고 그냥 null을 전달합니다. 그것이 반환이라면 나는 신경 쓰지 않았을뿐입니다.
out과 비슷한 작업을 수행 할 수있는 방법이 있습니까? 아니면 무시할 변수를 선언해야합니까?
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 (또는 TryWhatever) 패턴을 사용하여 실제 구문 분석 된 값에 신경 쓰지 않고 사용자 입력의 유효성을 테스트하는 데 사용되는 경우 (예 : 숫자로 구문 분석 할 수 있습니까?) 가장 일반적입니다.
질문에서 "dispose"라는 단어를 사용했습니다. 제가 생각하기에 불행한 것 같습니다.하지만 out 매개 변수가 IDisposable을 구현하는 유형 인 경우 메서드 설명서에서 값을받는 것이 허용되지 않는다고 명시 적으로 명시하지 않는 한 Dispose를 호출해야합니다. 소유권. 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 #으로 할 수 있습니다.
클래스가를 messages
구현 하는 경우 IDisposable
무시해서는 안됩니다. 다음 접근 방식과 같은 것을 고려하십시오 (한동안 C #을 작성하지 않았기 때문에 구문 상 정확하지 않을 수 있음).
using (FooClass messages) {
myResult = MakeMyCall(inputParams, messages);
}
using
블록을 벗어나면 messages
자동으로 폐기됩니다.
out 매개 변수에 대한 변수를 전달해야합니다. 전달하기 전에 변수를 초기화 할 필요가 없습니다.
MyMessagesType messages;
myResult = MakeMyCall(inputParams, out messages);
Typically, you can just ignore 'messages' after the call - unless 'messages' needs disposing for some reason, such as the use of limited system resources, in which case you should call Dispose():
messages.Dispose();
If it might use a significant amount of memory and it is going to remain in scope for a while, it should probably be set to null if it is a reference type or to a new default instance if it's a value type, so that the garbage collector can reclaim the memory:
messages = null; // Allow GC to reclaim memory for reference type.
messages = new MyMessageType(); // Allow GC to reclaim memory for value type.
In this case I made an generic extension method for ConcurrentDictionary that has no Delete or Remove method.
//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);
}
When called from an instance of ConcurrentDictionary:
ClientList.TryRemoveIgnore(client.ClientId);
참고URL : https://stackoverflow.com/questions/462167/how-to-explicitly-discard-an-out-argument
'programing' 카테고리의 다른 글
Java의 vararg 매개 변수에 대한 C # 대안이 있습니까? (0) | 2020.09.16 |
---|---|
CSS와 SCSS의 차이점은 무엇입니까? (0) | 2020.09.16 |
파이썬 내부 클래스의 목적은 무엇입니까? (0) | 2020.09.16 |
Django Admin의 모델 히스토리에 연결 (0) | 2020.09.16 |
C에서 예외를 던지는 방법은 무엇입니까? (0) | 2020.09.16 |