指向C#中的类型变量的指针:接口,通用,对象还是类? (装箱/拆箱)

时间:2011-01-06 00:18:42

标签: c# variables pointers boxing typed

首先,如果有人问了一千次,我道歉。我读了我的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:做了一些不正确的陈述,删除了它们并缩短了问题。

4 个答案:

答案 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修饰符,否则你无法做任何事情。话虽如此,您的选择是有限的。

  1. 使用对象而不是基本类型。
  2. 使用大小为1的数组。
  3. 自定义通用代理类,封装上述任意一种。
  4. ???

答案 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类型。