我必须存储对象的引用,以便在取消引用该引用时对该对象的值进行任何更新。一个简单的例子是
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#中实现这一点?
代码注释中提到的要求无法更改,但如果您有更好的解决方案,请建议。
答案 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
关键字的情况下分配引用即可取消引用。