首先,如果有人问了一千次,我道歉。我读了我的C#书,我用Google搜索了,但我似乎无法找到我想要的答案,或者我错过了重要的时间。
我对整个装箱/拆箱问题非常困惑。假设我有不同类的字段,都返回类型变量(例如'double'),我希望有一个变量指向这些字段中的任何一个。在普通的旧C中,我会做类似的事情:
double * newVar;
newVar = &oldVar;
newVar = &anotherVar;
...
我有一个定时器调用一个函数并传递引用变量的值:
ChartPlotData(*newVar);
我正在寻找指针的原因是因为newVar在运行时更改,并链接到一个事件:
public void checkbox_Clicked(object sender ...)
if (sender == checkbox1) value = &object1.field1;
if (sender == checkbox2) value = &object2.field1;
如何在C#中完成?
EDIT1:解释引用的目的。
EDIT2:做了一些不正确的陈述,删除了它们并缩短了问题。
答案 0 :(得分:1)
您可以按照编辑中的建议进行单击事件,然后使用委托选择要传递给控件的数据。我不确定这是否符合您的性能要求。
ChartPlotData(valueSelector());
// ...
Func<double> valueSelector;
protected void Checkbox_Click(object sender /* ... */)
{
if (sender == checkbox1) valueSelector = () => object1.field1;
if (sender == checkbox2) valueSelector = () => object2.field1;
// ...
}
(如果您愿意,如果可以的话,您可以重载ChartPlotData
方法以接受Func<double>
而非普通double
,然后调用选择器委托懒惰地在方法内而不是在呼叫站点。)
答案 1 :(得分:0)
简单类型和结构在C#中是值类型。除非你提到使用unsafe修饰符,否则你无法做任何事情。话虽如此,您的选择是有限的。
答案 2 :(得分:0)
您可以使用ref
keyword来引用现有值类型。
public static void ModifyNumber(ref int i)
{
i += 1;
}
static void Main(string[] args)
{
int num = 4;
ModifyNumber(ref num);
ModifyNumber(ref num);
ModifyNumber(ref num);
ModifyNumber(ref num);
// num now equals 8
}
答案 3 :(得分:0)
我不确定为什么你需要变量的地址。 Double是值类型,存储在堆栈中。要通过引用将其传递给方法,只需使用C#ref关键字。
从你提到的案例中我个人更喜欢这样的事情:
class Program
{
public class Refferenced<T> where T : struct
{
public T Value { get; set; }
}
static void Main(string[] args)
{
Refferenced<double> x = new Refferenced<double>();
Refferenced<double> y = new Refferenced<double>();
y.Value = 2;
x = y;
x.Value = 5;
Console.WriteLine(x.Value);
Console.WriteLine(y.Value);
y.Value = 7;
Console.WriteLine(x.Value);
Console.WriteLine(y.Value);
Console.ReadKey();
}
它类似于C#NullAble类型。