【问题标题】:How to declare a pointer to a class object in an unsafe block in C#如何在 C# 中的不安全块中声明指向类对象的指针
【发布时间】:2015-09-03 21:03:17
【问题描述】:

我不能像下面这样声明一个指向我自己的类对象的指针变量吗?

static void Main() {
    MyClass myClass = new MyClass();
    unsafe {
        fixed (MyClass* pMyClass = &myClass) {
            /// Do Somthing here with pMyClass..
        }
    }
}

【问题讨论】:

  • 你到底想做什么?
  • 我昨天开始知道关键字 unsafe & fixed,现在只是学习和测试。我找不到关于类对象的任何解释。你的意思是我不能或只是不学习?
  • 我们只是对您为什么要这样做感到困惑。
  • 我知道很多人不推荐在 C# 中使用 'unsafe' 并且期望得到这样的响应。但我正在学习 C# 并想了解更多。我知道我可能不会永远在 C# 中为对象使用指针,但希望能从像你们这样的专家那里听到更多关于 C# 潜在能力的信息。我认为“我知道但我不这样做”和“我不知道而且我不这样做”之间有很大的区别。

标签: c# pointers fixed unsafe


【解决方案1】:

此页面解释了原因:https://msdn.microsoft.com/en-us/library/y31yhkeb.aspx

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 关键字不能超越已取消引用的成员,它无权固定引用成员 _bar

现在可以说,仍然应该可以固定不包含其他引用成员的对象(例如简单的 POCO),并且可以固定 String 实例,但出于某种原因,C# 语言设计者刚刚决定禁止固定对象实例。

【讨论】:

  • 您可以不使用fixed 固定。相反,您使用GCHandle.Alloc(..., GCHandleType.Pinned)
猜你喜欢
  • 2014-12-01
  • 2020-04-03
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 2021-12-03
  • 2021-12-22
相关资源
最近更新 更多