C# 如何在C中的不安全块中声明指向类对象的指针#
我不能像下面那样声明一个指向我自己的类对象的指针变量吗C# 如何在C中的不安全块中声明指向类对象的指针#,c#,pointers,fixed,unsafe,C#,Pointers,Fixed,Unsafe,我不能像下面那样声明一个指向我自己的类对象的指针变量吗 static void Main() { MyClass myClass = new MyClass(); unsafe { fixed (MyClass* pMyClass = &myClass) { /// Do Somthing here with pMyClass.. } } } 本页解释了原因: C#不允许指向引用的指针: 指针不能指向引用或
static void Main() {
MyClass myClass = new MyClass();
unsafe {
fixed (MyClass* pMyClass = &myClass) {
/// Do Somthing here with pMyClass..
}
}
}
本页解释了原因:
C#不允许指向引用的指针:
指针不能指向引用或包含引用的结构,因为即使指针指向对象引用,也可以对其进行垃圾收集。垃圾收集器不跟踪对象是否被任何指针类型指向
您可能认为fixed
关键字应该允许这样做,因为它会阻止GC收集对象。这可能是正确的,但考虑到这种情况:
class Foo {
public SomeOtherComplicatedClassAllocatedSeparatley _bar;
}
unsafe void Test() {
Foo foo = new Foo();
foo._bar = GetComplicatedObjectInstanceFromSomePool();
fixed(Foo* fooPtr = &foo) {
// what happens to `_bar`?
}
}
fixed
关键字不能过度延伸到已取消引用的任何成员中,它无权锁定引用成员\u bar
现在可以说,仍然可以锁定不包含其他引用成员的对象(例如简单的POCO),也可以锁定字符串实例,但出于某种原因,C语言设计人员刚刚决定禁止锁定对象实例。本页解释了原因:
C#不允许指向引用的指针:
指针不能指向引用或包含引用的结构,因为即使指针指向对象引用,也可以对其进行垃圾收集。垃圾收集器不跟踪对象是否被任何指针类型指向
您可能认为fixed
关键字应该允许这样做,因为它会阻止GC收集对象。这可能是正确的,但考虑到这种情况:
class Foo {
public SomeOtherComplicatedClassAllocatedSeparatley _bar;
}
unsafe void Test() {
Foo foo = new Foo();
foo._bar = GetComplicatedObjectInstanceFromSomePool();
fixed(Foo* fooPtr = &foo) {
// what happens to `_bar`?
}
}
fixed
关键字不能过度延伸到已取消引用的任何成员中,它无权锁定引用成员\u bar
现在可以论证的是,仍然可以锁定不包含其他引用成员的对象(例如,简单POCO),并且可以锁定字符串
实例,但出于某种原因,C语言设计师刚刚决定禁止固定对象实例。你到底想做什么?我昨天开始知道关键字“不安全&已修复”,现在正在学习和测试。我找不到任何关于类对象的解释。你的意思是我不能或只是不研究它?我们只是对你为什么要这样做感到困惑。我知道很多人不建议在C#中使用“不安全”,也不建议这样的回答。但我正在学习C#,想知道更多。我知道我可能不会永远使用C#中的对象指针,但我希望从像你们这样的专家那里听到更多关于C#潜在能力的信息。我认为“我知道,但我不做”和“我不知道,我不做”之间有很大的区别。你到底想做什么?我昨天开始了解关键字“不安全”和“修复”,现在只是学习和测试。我找不到任何关于类对象的解释。你的意思是我不能或只是不研究它?我们只是对你为什么要这样做感到困惑。我知道很多人不建议在C#中使用“不安全”,也不建议这样的回答。但我正在学习C#,想知道更多。我知道我可能不会永远使用C#中的对象指针,但我希望从像你们这样的专家那里听到更多关于C#潜在能力的信息。我认为“我知道,但我不做”和“我不知道,我不做”之间有很大的区别。你可以不用固定。相反,您可以使用GCHandle.Alloc(…,GCHandleType.pinted)
您可以在不使用固定的情况下固定。而是使用GCHandle.Alloc(…,GCHandleType.pinted)