Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中的不安全块中声明指向类对象的指针#_C#_Pointers_Fixed_Unsafe - Fatal编程技术网

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)