存储对象的引用

时间:2017-05-23 18:46:03

标签: c# reference

我必须存储对象的引用,以便在取消引用该引用时对该对象的值进行任何更新。一个简单的例子是

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应该返回ref T而不是T,而Main方法当我解除a.func()的返回值时,我会能够得到预期的答案。我怎样才能在C#中实现这一点?

代码注释中提到的要求无法更改,但如果您有更好的解决方案,请建议。

1 个答案:

答案 0 :(得分: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关键字的情况下分配引用即可取消引用。