2017-05-23 5 views
0

개체에 대한 참조를 저장해야 해당 참조가 역 참조 될 때마다 개체 값이 업데이트됩니다. 간단한 예를 들어 내가 a.func()의 반환 값을 DEREF 할 때 개체에 대한 참조 저장

using System.Collections.Generic; 
namespace ABCD 
{ 
    public class ClassA<T>{ 
     T t; 
     public T func(T num){ 
      t = (T)(object)(2*(double)(object)num);//t has to be assigned in this method (not in func2) 
      T x = func2(); 
      t = (T)(object)(3*(double)(object)num);//t will be reassigned here, and I want this to be reflected in x 
      return x;//I want x to be 9 not 6 
     } 
     public T func2(){ 
      return t; 
     } 
    } 

    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      ClassA<double> a = new ClassA<double>(); 
      System.Console.WriteLine(a.func(3.0)); 
     } 
    } 
} 

그래서 func 대신 Tref T를 반환하고, Main 방법으로해야한다, 내가 예상 답변을 얻을 수있을 것입니다. C#에서 어떻게 만들 수 있습니까?

코드 주석에 언급 된 요구 사항은 변경할 수 없지만 더 나은 해결책이 있다면 제안하십시오.

답변

0

당신은 그런 식으로 작업을 수행 할 수 있습니다

using System; 

namespace ABCD 
{ 
    public class ClassA<T> 
    { 
     T t; 
     public T func(T num) 
     { 
      t = (T)(object)(2 * (double)(object)num);//t has to be assigned in this method (not in func2) 
      ref T x = ref func2(); 
      t = (T)(object)(3 * (double)(object)num);//t will be reassigned here, and I want this to be reflected in x 
      return x;//I want x to be 9 not 6 
     } 
     public ref T func2() 
     { 
      return ref t; 
     } 
    } 

    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      ClassA<double> a = new ClassA<double>(); 
      Console.WriteLine(a.func(3.0)); 
      Console.ReadLine(); 
     } 
    } 
} 

ref 키워드는 당신이 여기에서 필요로 정확히 참조, 같은 무언가를 표시합니다.

ref 키워드를 사용하려면 컴파일러에서 사용자가 저장 한 참조임을 알 수 있도록 왼쪽에 추가해야하며 오른쪽에는 참조에 대한 참조를 할당해야합니다. 메소드의 헤더 (메소드의 유형은 나중에 참조로 사용하기 때문에 참조 여야 함)와 return 명령문 (리턴해야하기 때문에 메소드의 헤더에 있어야합니다. 올바른 유형). 참조는 ref 키워드없이 간단히 지정하여 역 참조 할 수 있습니다.

+0

저는 C#이 좋지 않지만 예제가 컴파일되지 않습니다. http://rextester.com/PNXRI65492 확인하십시오. –

+0

@ JaneDorothy 이것은 Rextester의 문제인 것 같습니다. 예를 들어 Linqpad로 컴파일하면 다음과 같이 작동합니다. http://csharppad.com/gist/11e494cc65b43ad5fd90cb273c8e629c - 어쨌든 VS를 사용하는 것이 좋습니다. 온라인 컴파일러가 유용합니다. 짧은 코드 테스트는 가능하지만 실제 프로그래밍에는 적합하지 않습니다. – MetaColon

+0

물론 저는 C# 패드를 사용합니다. – MetaColon