2009-09-02 2 views
67

가정하자 내가 가진 :C 번호에 '밖으로'매개 변수로 속성을 전달

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

내가

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

같은 출력 매개 변수로 멤버를 전달하려는하지만 난 얻을 컴파일 오류, " 'out'인수가 변수로 분류되지 않았습니다."이 달성 할 수있는 방법이 있습니까, 아니면 변수를 추출해야 할 것입니다, 일품 :

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

[가능한] "out"또는 "ref"매개 변수로 속성을 전달할 수 있습니까?] (http://stackoverflow.com/questions/564557/is-it-possible-to-pass-properties-as) -out-or-ref-parameters) – nawfal

답변

75

명시 적으로 자동 구현 대신 필드와 "정상"속성을 사용해야 할 것 속성 :

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

당신은 밖으로 매개 변수로 필드을 전달할 수 있습니다

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

첫 번째 접근법의 문제점은 속성 대신 필드를 직접 사용하면 속성에 존재할 수있는 유효성 검사 규칙을 건너 뛸 수 있다는 것입니다. –

+0

@Dreas : if 그것은 자동으로 구현 된 속성입니다. 아마도 유효성 검사 규칙을 가질 수는 없습니다 ... –

+3

@ 존 : 나는 parseOrDefault 예제에서 int.Parse를 int.TryParse로 변경하려고합니다. – shahkalpesh

4

성취 할 수는 있지만 재산으로는 할 수 없습니다.

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

    public int AnotherValue; // This is a field 
} 

당신은 Valueout를 사용할 수 없지만 AnotherValue에 수 있습니다.

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

을 작동하지만, 일반적인 지침은 클래스 필드를 공개하지 않는 방법을 알려줍니다. 따라서 임시 변수 접근 방식을 사용해야합니다.

+0

오, 예 * 필드 *, 나는 틀린 용어를 사용했습니다. –