C#中的对象指针(Object*)

本文关键字:Object 指针 对象 | 更新日期: 2023-09-27 18:00:02

我想做的是,我想传递一个指向函数的指针,该函数可以是任何类型的变量(int、long、string,甚至是一个类,我的意思是我应该能够传递任何变量的指针)。我这样做就像

unsafe class whatever
{
    whatever(object* variable)
    {
          this.variable = variable;
    }
}

错误IS:无法获取的地址、获取的大小或声明指向托管类型("object")的指针

我想做的是,我将存储通过构造函数传递的变量,并使用它们的ToString()方法,我正在尝试为控制台应用程序创建一个类,用更新的变量刷新变量。

如果我能这样做,我的代码会像一样

unsafe class whatever
{
    whatever(object* variable)
    {
        this.variable = variable;
    }
    object* variable;
    public override string ToString()
    {
        return *variable.ToString();
    }
}

C#中的对象指针(Object*)

也许您应该传入一个委托,您的类可以使用该委托来获取"对象字符串"。

class MyFancyClass
{
    Func<string> getObjectString;
    public MyFancyClass(Func<string> getObjectString)
    {
        this.getObjectString = getObjectString;
    }
    private MyOtherThread()
    {
        // ...
        string desc = getObjectString();
        // ...
    }
}
// ...
long value = 34;
MyFancyClass fancy = new MyFancyClass(() => value.ToString());
// ...
value = 88;
// getObjectString() should now reflect the new value.
// The variable is captured in the lambdas closure.

但是要小心,因为委托是从另一个线程调用的,简单地调用ToString()可能对所有对象都不安全,并且需要锁定。但是,委托允许调用方执行此操作,具体取决于对象。

指针会变得丑陋,需要不安全的代码并且不稳定。如果不明确地固定指针,垃圾收集器可以自由地移动对象。引用不能存储,只能四处传递。

在C#中,通常不使用指针。如果你想参考一个存储位置,可以试试这个:

whatever(ref object variable)
{
}

否则,我建议使用包装类或其他方法来获取某个变量。包装器可能看起来像这样:

class Wrapper
{
    public object Value { get; set; }
}

如果要获取变量的地址,它不能是复杂的托管类型。然而,您可以这样做(假设环境不安全):

int a = 1;
IntPtr addr = ( IntPtr )( &a );
( * ( int* ) addr ) = 4;

a=4;

这就是你要找的吗?

编辑:

如果您只是想保存对象中的"函数指针",只需使用委托即可。

class whatever
{
    public whatever(object variable)
    {
        getVariableValue = variable.ToString;
    }
    Func<string> getVariableValue;
    public override string ToString()
    {
        return getVariableValue();
    }
}
void Main()
{
    var type = new { F1 = "test", F2 = "value" };
    whatever w = new whatever( type );
    Console.WriteLine( w ); // This will invoke ToString
}

输出:{F1=测试,F2=值}

你想要一个空位*,但要用这些空位。如果你选错了演员,它就会崩溃。在这种情况下,制作一个结构并转换为intptr可能是一个明智的想法。