C #에서 속성을 'out'매개 변수로 전달


81

내가 가지고 있다고 가정합니다.

public class Bob
{
    public int Value { get; set; }
}

Value 멤버를 다음과 같은 out 매개 변수로 전달하고 싶습니다.

Int32.TryParse("123", out bob.Value);

하지만 컴파일 오류가 발생합니다. " 'out'인수는 변수로 분류되지 않습니다." 이것을 달성하는 방법이 있습니까, 아니면 변수를 추출해야합니까?

int value;
Int32.TryParse("123", out value);
bob.Value = value;

답변:


83

자동 구현 속성 대신 필드와 "일반"속성을 명시 적으로 사용해야합니다.

public class Bob
{
    private int value;
    public int Value
    { 
        get { return value; } 
        set { this.value = value; }
    }
}

그런 다음 필드 를 out 매개 변수로 전달할 수 있습니다 .

Int32.TryParse("123", out bob.value);

그러나 물론 필드가 비공개이므로 동일한 클래스 내에서만 작동합니다 (그리고 그래야합니다!).

속성은이 작업을 허용하지 않습니다. 당신이 할 수 있는 VB에서도참조로 속성을 전달하거나 out 매개 변수로 사용할 기본적으로 추가 임시 변수가 있습니다.

의 반환 값에 대해 신경 쓰지 않았다면 TryParse항상 고유 한 도우미 메서드를 작성할 수 있습니다.

static int ParseOrDefault(string text)
{
    int tmp;
    int.TryParse(text, out tmp);
    return tmp;
}

그런 다음 다음을 사용하십시오.

bob.Value = Int32Helper.ParseOrDefault("123");

이렇게하면 여러 위치에서이 작업을 수행해야하는 경우에도 단일 임시 변수를 사용할 수 있습니다.


1
첫 번째 접근 방식의 문제는 속성 대신 필드를 직접 사용하면 속성에 존재할 수있는 유효성 검사 규칙을 우회 할 수 있다는 것입니다
Andreas Grech

3
@Jon : ParseOrDefault 예제에서 int.Parse를 int.TryParse로 변경하고 싶습니다.
shahkalpesh

8
Btw, 출력 매개 변수로 속성을 가질 수없는 이유는 속성 설정이 실제로 함수 호출이고 내부를 살펴보면 할당이 없기 때문입니다.
Dirk Vollmar

3
속성을 ref 또는 out 매개 변수로 전달할 수 있도록 적절한 구문 설탕을보고 싶습니다. 컴파일러에게 작업을합시다. 나보다 빠릅니다.
Ignacio Soler Garcia

1
@SoMoS : 가치 유형이든 아니든 내 의견에 차이가 없습니다. 매개 변수에 대한 메서드 내 변경 사항이 즉시 적용되거나 적용되지 않습니다. 이것은 예외가 발생하는 경우에도 영향을 미칩니다.
Jon Skeet 2013 년

7

당신은 그것을 달성 할 수 있지만 속성으로는 불가능합니다.

public class Bob {
    public int Value { get; set; } // This is a property

    public int AnotherValue; // This is a field
}

당신은 사용할 수 없습니다 outValue,하지만 당신은에 수 있습니다AnotherValue .

이것은 작동합니다

Int32.TryParse("123", out bob.AnotherValue);

그러나 공통 지침에 따라 클래스 필드를 공개하지 말아야합니다. 따라서 임시 변수 접근 방식을 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.