2010-04-15 2 views
5

강제로이 키워드를 ref 인수로 사용하는 방법이 있습니까? 개체의 여러 속성을 수정하는 방문자를 전달하고 싶습니다. 그러나 이것은 값 매개 변수처럼 작동하기를 원합니다. 객체에이 키워드에 ref 매개 변수를 사용 하시겠습니까?

코드 : 방문자의

public void Accept(Visitor<MyObject> visitor) 
{ 
    visitor.Visit(this); 
} 

코드 :

public void Visit(ref Visitor<MyObject> receiver) 
{ 
    receiver.Property = new PropertyValue(); 
    receiver.Property2 = new PropertyValue(); 
} 

답변

10

실제로 ref 키워드에 대한 필요가 없습니다 receiver가 참조 무엇을 변경하지 않기 때문에. 그러나 그러한 경우라면 this을 다른 인스턴스로 참조 할 수 없습니다.

ref 매개 변수로 this를 전달하기 위해, 당신은 이런 식으로 작성해야합니다 :

Visit(ref this); 

는 그 코드가 컴파일되지 않습니다 : 는 " '<이 >'는 심판이나 기절 할 수 없습니다 읽기 전용이기 때문에 인수가 없습니다 "

+0

네, 맞습니다. 하지만 원래 클래스가 방문자가 변경 한 내용을 유지하기를 원합니다. ref로 전달하지 않으면 의 * copy * 속성 만 수정하면됩니까? – grefly

+0

@grefly : "this"가 클래스가 아닌 경우. 사용자 정의 struct (값 유형)를 "방문"하지 않으면 ref는 필요하지 않습니다. –

+0

감사합니다, 당신이 맞습니다! – grefly

5

Visitor<T>이 클래스 인 경우 ref 키워드가 필요하지 않습니다. 그들이

+0

맞습니다. 죄송합니다. 답변으로 두 가지를 모두 표시 할 수 없습니다. – grefly

0

당신이 정말 심판 키워드가 필요하십니까 방법을 변경하는 경우

클래스 내부의 모든 정보를 자동으로 변경된다?

ref는 수신기 인스턴스를 변경하는 경우 유용합니다. 예 : receiver = null;

그렇지 않으면

receiver.Property은 심판 키워드 이미 큰 질문에 대한 대답을 얻었다처럼 소리

4

없이도 액세스 할 수 있습니다. 하지만 어쨌든 이것을 고려해 봅시다.

강제로이 키워드를 ref 인수로 사용하는 방법이 있습니까?

예. 그것을 논리적으로 일하십시오.

  • 의 Ref 인수는 변수에 대한 별칭한다.
  • 은 "이"참조 형식
  • 에서 변수 않음 "이"치형 따라서
  • 의 변수 a를 "이 심판"전달하는 유일한 방법이며 값 타입의 인스턴스 메소드 내지 .

실제로 "이"가 장면 뒤에 값 유형으로 구현되는 방법입니다. 네가 (최악의 연습을 할 때!

struct S 
{ 
    private int x; 
    public void M() 
    { 
     this.x = 123; 
    } 
} 
... 
S s = new S(); 
s.M(); 

S의 인스턴스가 에 의해 전달되기 때문에 어떻게 M 변이의의이다 : 실제로이) 가변 값 유형을하지 않는다? s는 참조로 전달되어야합니다! 사실 우리가 생성하는 코드는 같은 것을 작성했던 것처럼입니다 : 요컨대

struct S 
{ 
    private int x; 
    public static void M(ref S THIS) 
    { 
     THIS.x = 123; 
    } 
} 
... 
S s = new S(); 
S.M(ref s); 

을하는 "이"함께 건네 아무 문제가 없다, 그래서 이미 REF 파라미터로 전달되는 구조체에 다시. 그렇게하는 것은 거의 항상 끔찍한 생각입니다.하지만 합법적입니다.