【问题标题】:Pointers to class of root type in C#指向 C# 中根类型类的指针
【发布时间】:2011-04-27 19:01:09
【问题描述】:

我是 C# 的新手,不知道如何为我定义的类类型实现指针接口。它在 C++ (虽然,我从大学以来就没有做过)或 C (我一直这样做)非常容易做到,但是我在 C# 中没有遇到错误。

在示例中更清晰。假设你想实现一个家谱:

class person{
   person* mom;
   person* dad;
   string Name;
   string Birthdate;     

   person[] children;


//...constructors, destructors, methods etc...
}

VS2010 告诉我“无法声明指向托管类型的指针” 我不想知道此类问题的良好实现(因为我将使结构非常定制,而不是像树一样的任何东西),只是如何声明指向包含指针类型的对象的指针(在 C# 中) 这是使用类的错误方式吗?

【问题讨论】:

    标签: c# class pointers


    【解决方案1】:

    删除指针,您的代码将正常工作。在 C# 中,类已经是引用,没有值 class 这样的东西,该构造称为 struct。

    【讨论】:

    • 我不确定我是否理解这个答案,因为结构实际上不是一种类型。在 C 中我可能会使用 typedef 结构来完成类型的递归定义,但我不知道您将如何在 C# 中执行 typedef。
    • C# 的 struct 相当于 C 中的堆栈分配对象,而 C# 的 class 相当于 C 中的堆分配对象。class 更接近双倍实际上是指针,其中 C# 中的 person 有点像 C 中的 person **。
    【解决方案2】:

    你不需要将它们声明为指针,就像类型一样:

    class person{
       person mom;
       person dad;
       string Name;
       string Birthdate;     
    
       // Though I would probably use ICollection<Person> or IList<person>
       person[] children;
    
       //...constructors, destructors, methods etc...
    }
    

    由于person 是reference type,这就是您所需要的。

    通常,c# 中不需要指针(尽管您可以在标记为unsafe 的代码中使用它们)。

    【讨论】:

    • 优秀的答案,感谢其他参考类型和集合的提示(抢占了我正在写的其他问题)。
    【解决方案3】:

    只要你有一个class 类型的变量,它就会自动成为一个引用。 C# 中的引用与 C++ 中的指针非常相似,只是您不能用它进行算术运算。

    与 C++ 不同,您不会在声明变量时决定使用引用/值,而是在声明类型时。作为引用或值类型是类型的固有属性。

    【讨论】:

      【解决方案4】:

      嗯...您不需要 C# 上的指针(执行此操作)。如果您的意图是创建“树”,只需删除类型名称前面的“*”符号即可。

      希望对你有帮助。

      【讨论】:

        【解决方案5】:

        C# 代码不使用指针。虽然可以编写使用指针的 C#,但此代码被称为“不安全”,在普通代码中使用此功能的理由很少(如果有的话)。

        任何 .NET 语言中的所有类都称为“引用类型”。这意味着无论您在代码中看到该类型用于变量、成员或参数类型的任何位置,该对象的值都是一个 reference,它(因为没有更好的术语)指向一个 实例的类型。换句话说,它们的功能与指针非常相似,尽管只是在最基本的意义上(例如,没有“参考算术”之类的东西)。

        长话短说,只需从声明中删除星号,您的代码就会按照您最初的预期工作。虽然您的代码存在一些风格问题(.NET 代码通常是 PascalCased,而不是 camelCased,最好不要直接公开成员变量,而是使用属性),这应该可以帮助您。

        【讨论】:

          猜你喜欢
          • 2015-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-14
          • 1970-01-01
          • 2010-10-22
          相关资源
          最近更新 更多