2012-05-23 6 views
5

저는 약간의 검색을 해왔지만 다른 변수에 대한 참조를 특정 변수에 저장하는 방법을 찾을 수 없습니다. 사용자가 수행 한 작업을 취소하기 위해 클래스를 만들려고합니다.다른 변수에 대한 참조 저장

class UndoAction 
{ 
    public object var; 
    public object val; 
    public UndoAction(ref object var, object val) 
    { 
     this.var = var; 
     this.val = val; 
    } 

    public static List<UndoAction> history = new List<UndoAction>(); 
    public static void AddHistory(ref object var, object val) 
    { 
     history.Add(new UndoAction(ref var, val)); 
    } 
} 

여기서 내가 성취하려는 것을 볼 수 있습니다.

내가 겪은 문제;

this.var = var; 

은 참조를 저장하지 않지만 참조 된 'var'값은 저장합니다. 간단히 실행할 수 있도록 참조 자체를 어떻게 저장할 수 있습니까?

this.var = val; 

내 경우에는 작업을 "실행 취소"하시겠습니까?

+1

http://stackoverflow.com/a/4543089 – dtb

+1

http://stackoverflow.com/a/6346059 – dtb

+1

http://blogs.msdn.com/b/ericlippert/archive/2011/06/23/ref -returns-and-ref-locals.aspx – dtb

답변

8

표준 안전 C#은이 기능을 전혀 지원하지 않습니다. 기본 프레임 워크에는 필요한 모든 개념이 거의 있지만 C# 언어로 표시되지 않습니다. 그러나 그런 경우에도 이러한 참조는 필드에 저장할 수 없습니다.

당신이 가질 수있는 가장 좋은 점은 델리게이트를 사용하는 어떤 클래스에서 랩핑하는 것입니다. 이것은 분명히 비해 다소 비싸지 만 당신이 꽉 루프에서 일을 수정하지 않는 한이 충분 수 있습니다 :

class VarRef<T> 
{ 
    private Func<T> _get; 
    private Action<T> _set; 

    public VarRef(Func<T> @get, Action<T> @set) 
    { 
     _get = @get; 
     _set = @set; 
    } 

    public T Value 
    { 
     get { return _get(); } 
     set { _set(value); } 
    } 
} 

그리고 다음과 같이 사용 :

C#에서
var myVar = ... 
var myVarRef = new VarRef<T>(() => myVar, val => { myVar = val; }); 

... 

myVarRef.Value = "47"; 
Console.WriteLine(myVar); // writes 47 
0

, 모든 클래스 객체에서 상속받은 객체는 참조 유형이됩니다.

즉, 명시 적으로 개체를 복제하지 않으면 참조 만 있고 새 개체가 아닙니다.

this.var = var; # <- that actually gets the reference to var, and not clones the object. 

당신이 this.var 환경이 당신에게서 그것을 숨기고 당신이 참조 주소 자체를 알 수 없기 때문에 개체가 보유하고 볼 경우.

1

잘못된 길로 가고 있습니다. 권투/Unboxing은 필요한 것이 아니며 개체 참조와 특정 속성 및 해당 속성의 값을 저장해야합니다.

인류의 생성을 취소 할 수있는 완전히 일반적인 시스템을 만들지 마십시오. 간단하게 시작하십시오.

다음과 같은 인터페이스로 특정 개체를 설정하여 시작하십시오. IUndoable.

[UnduableProperty]와 같은 특정 속성 표시 INotifyPropertyChange 인터페이스를 사용하고 PropertyChanged 이벤트를 사용합니다. 속성이 변경되면 청취하고 실행 취소 할 수 있는지 확인한 다음 값을 저장하십시오.

리플렉션을 사용하는 것을 두려워하지 말고 속도 문제를 해결할 수 있으면 피하십시오.

개체를 저장하고 속성을 저장하고 값을 저장합니다. 관리자 오브젝트를 작성하여 실행 취소 프로세스를 관리하십시오.

복잡한 구조체 값을 저장하는 데 문제가 있으면 ISerializable을 잊지 마세요.

행운을 빈다.

관련 문제