2010-02-25 93 views
41

我正在写一个与树型数据结构一起工作的应用程序。我用C++编写了它,现在我想用C#编写它。我使用指针来实现树型数据结构。 C#中是否还有指针?使用它安全吗?在C#中有像C++一样的指针吗?它安全吗?

+3

请问,您可以先在SO上搜索这些关键字,然后只询问尚未涵盖的内容。 – 2010-02-25 11:28:35

+2

带指针的代码必须标记为'unsafe',猜猜原因。 – nothrow 2010-02-25 11:30:53

+1

实际上使用指针在任何地方都不安全;) – 2010-02-25 11:36:09

回答

36

如果您要在C#(或Java或许多其他语言)中实现树结构,则可以使用引用而不是指针。 NB。 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构造函数时*修改类型(他们已经为空)
  • 没有特别的->运营商为会员访问
  • 没有必要写一个析构函数(虽然查找IDisposable
+0

指针和引用之间的重要区别:后者不支持指针运算! – 2010-02-25 11:47:19

+17

@Joachim - 让我们都祈祷他在他的树结构中通常不使用指针算术。 – 2010-02-25 11:58:21

+0

感谢您的帮助。 – 2010-02-25 13:01:32

17

C#中是否还有指针?

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

正在使用该安全吗?

无指针是不安全

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

+0

有趣的答案。不幸的是,与yes部分的链接似乎被破坏了(即下载完整vs 2005文档而不是特定的语言特性)。拳击/拆箱给人的印象是安全的;为什么不是? – Christophe 2017-11-02 09:02:59

+0

@Christophe谢谢,修复了损坏的链接。还澄清了措辞,拳击/ unobxing是安全的方法来避免不安全的指针。 – kennytm 2017-11-02 13:12:51

+0

更清晰!谢谢 – Christophe 2017-11-02 13:51:32

28

。 C#中有指针。

NO。他们是不是安全。

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

对于实例看hereMSDN

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

Increment(&count); 

用此来代替,而代码将是安全和干净。

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

Increment(ref count); 
+12

谈谈自我记录代码! – LiraNuna 2010-02-25 11:47:53

2

有一个伟大的系列赛上MSDN中的.Net 2实现的数据结构。

Data Structures Part 1

它们包括的东西像二叉树,图,SkipList,节点列表等示例代码的代码非常完整,包括为什么这些结构工号的文档的页面等

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

不使用不安全代码指针的最大原因是您失去了中等信任合规性。你不能运行像click一样的机制,asp.net网站和Silverlight也不允许它们。坚持参考和完全管理的概念,以确保您的代码可以在更多地方运行。

相关问题