【问题标题】:Is there pointer in C# like C++? Is it safe?C# 中是否有像 C++ 这样的指针?安全吗?
【发布时间】:2010-02-25 11:26:16
【问题描述】:

我正在编写一个使用树数据结构的应用程序。我已经用 C++ 编写了它,现在我想用 C# 编写它。我使用指针来实现树数据结构。 C#中也有指针吗?使用起来安全吗?

【问题讨论】:

  • 拜托,你能先在 SO 上搜索这些关键字,然后只询问尚未涵盖的内容。
  • 带有指针的代码必须标记为“不安全”,猜猜为什么。
  • 实际上使用指针在任何地方都不安全;)
  • @Machine Charmer - 如果您不知道自己在做什么,这只是不安全的(不幸的是,您通常与不知道自己在做什么的人一起工作)
  • 这是一篇我觉得很容易理解的文章。 c-sharpcorner.com/UploadFile/pcurnow/…

标签: c# c++ data-structures tree


【解决方案1】:

如果您在 C#(或 Java 或许多其他语言)中实现树结构,您将使用引用而不是指针。注意。 C++ 中的引用与这些引用不同。

用法大部分类似于指针,但有垃圾回收等优点。

class TreeNode
{
    private TreeNode parent, firstChild, nextSibling;

    public InsertChild(TreeNode newChild)
    {
        newChild.parent = this;
        newChild.nextSibling = firstChild;
        firstChild = newChild;
    }
}

var root = new TreeNode();
var child1 = new TreeNode();
root.InsertChild(child1);

兴趣点:

  • 声明成员时无需修改*的类型
  • 无需在构造函数中将它们设置为 null(它们已经为 null)
  • 没有特殊的-> 运算符用于成员访问
  • 无需编写析构函数(尽管查找IDisposable

【讨论】:

  • 指针和引用的重要区别:后者不支持指针运算!
  • @Joachim - 让我们都祈祷他通常不会在他的树结构中使用指针算法。
  • 这个答案没有解决实际问题。从谷歌搜索来到这里,幸运的是其他人实际上已经回答了这个问题......
【解决方案2】:

是的。 C#中有指针。

。它们安全。

在 C# 中使用指针时,实际上必须使用关键字 unsafe

例如查看 hereMSDN

static unsafe void Increment(int* i)
{
    *i++;
}

Increment(&count);

改用它,代码将是安全和干净的。

static void Increment(ref int i)
{
    i++;
}

Increment(ref count);

【讨论】:

    【解决方案3】:

    C#中也有指针吗?

    Yes,使用语法 int* varName; 声明。

    那个保险箱在用吗?

    没有指针不安全

    有一些安全的方法可以构建没有指针的数据结构。如果节点是类,那么它们将自动为reference types,因此您不需要任何指针。否则,您可以box them into a reference

    【讨论】:

    • 有趣的答案。不幸的是,yes 部分的链接似乎已损坏(即下载完整的 vs 2005 文档而不是特定语言功能)。装箱/拆箱给人的印象是它是安全的;为什么不是?
    • @Christophe 谢谢,修复了损坏的链接。还澄清了措辞,即装箱/取消装箱是避免不安全指针的安全方法。
    【解决方案4】:
    【解决方案5】:

    在 MSDN 上的 .Net 2 中实现了一系列很棒的数据结构。

    Data Structures Part 1

    它们包括二进制搜索树、图形、SkipList、NodeList 等的示例代码。代码非常完整,并包含许多关于这些结构为何起作用的文档等。

    Microsoft 的没有一个使用指针。一般来说,您永远不需要在 C# 中使用它们。有时使用它们会很好,或者它们只是您从 C++ 中思考的方式。但您通常可以找到不使用它们的方法。

    为什么不对指针使用不安全代码的最大原因是您失去了中等信任合规性。您无法通过单击一次、asp.net 网站等机制运行,Silverlight 也不允许它们。坚持使用 refs 和完全托管的概念,以确保您的代码可以在更多地方运行。

    【讨论】:

    • 链接不再支持
    猜你喜欢
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 2011-06-02
    • 1970-01-01
    相关资源
    最近更新 更多