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();
}
}
也许您应该传入一个委托,您的类可以使用该委托来获取"对象字符串"。
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可能是一个明智的想法。