C# 中是不是有像 C++ 这样的指针?安全吗?
Posted
技术标签:
【中文标题】C# 中是不是有像 C++ 这样的指针?安全吗?【英文标题】: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/… 【参考方案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
。
例如查看 here 和 MSDN。
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】:是的,有一个指针: IntPtr
***:"which is a safe managed equivalent to int*, and does not require unsafe code"
【讨论】:
blogs.msdn.com/jaredpar/archive/2008/11/11/…【参考方案5】:在 MSDN 上的 .Net 2 中实现了一系列很棒的数据结构。
Data Structures Part 1
它们包括二进制搜索树、图形、SkipList、NodeList 等的示例代码。代码非常完整,并包含许多关于这些结构为何起作用的文档等。
Microsoft 的没有一个使用指针。一般来说,您永远不需要在 C# 中使用它们。有时使用它们会很好,或者它们只是您从 C++ 中思考的方式。但您通常可以找到不使用它们的方法。
为什么不对指针使用不安全代码的最大原因是您失去了中等信任合规性。您无法通过单击一次、asp.net 网站等机制运行,Silverlight 也不允许它们。坚持使用 refs 和完全托管的概念,以确保您的代码可以在更多地方运行。
【讨论】:
链接不再支持以上是关于C# 中是不是有像 C++ 这样的指针?安全吗?的主要内容,如果未能解决你的问题,请参考以下文章
PHP 中是不是有像现在 C# 中那样的特殊对象初始化器构造?
在 C# 中是不是有像 Dictionary<> 这样的类,但只有键,没有值?
就像java一样,c ++中有像timer和timertask这样的东西吗?