【问题标题】:How can I simulate pointers without using them?如何在不使用指针的情况下模拟指针?
【发布时间】:2011-12-14 13:59:48
【问题描述】:

我有一个在 Azure 上运行的 C# 代码,并且支持 Web,因此它应该是安全的。这意味着我不能使用指针。

我遇到了这个问题 - 我的数据结构是一个 SortedList,其中每个节点都是对象 X。每个对象 X 包含一个数组,其中每个单元格是对象 Y 的另一个 SortedList。类型 X 和 Y 的对象具有不同的 ID(所以它们当然是可搜索的)。

现在,我需要一种直接访问 Y 对象的方法,而无需通过 X 对象和 Y 对象对其进行搜索。 (可能是数百万的对象)

在 C/C++ 中,我会使用带有指向实际对象的指针的 Y 对象 ID 列表。这样我只搜索一次对象。

有什么想法可以在 C# 中实现吗?

谢谢!

【问题讨论】:

  • C# 中没有指针的原因是几乎所有东西都是指针。如果你说MyClass p = a[i];p 就是一个指针。 a 是一个指针数组,a[i]p 都指向同一个对象。你不能做的是指针算法
  • 哦...所以我可以有一个指针列表。只需将它们声明为对象(不初始化它们)?
  • 谢谢。看来我的对象有资格成为引用类型,即 - 一种指针:)
  • 如果你模拟指针,你也会模拟相关的问题。指针本质上是一种间接方式。除非您采取额外的步骤(检查每个间接引用,如果它仍然有效),否则它无法引导您到任何地方。换句话说:模拟指针并没有比简单地使用它们带来任何基本的安全优势。

标签: c# c data-structures pointers


【解决方案1】:

只需像在 C++ 解决方案中一样使用 C# 中的实例,但没有 -> C++ 指针 deref。所有在 .NET 中引用类类型实例的东西都是对象引用,它们实际上是指针。如果您在 C# 中构造一个类型的实例并将其分配给变量和数组元素并将其作为参数传递,那么所有这些都是指向内存中相同对象数据的指针。

无需在 C# 中模拟指针。一切都已经是一个指针。

【讨论】:

  • 谢谢 :) 这就是我要找的答案!
【解决方案2】:

你可以尝试散列,有Hashtable 班级。如果所有内容都在排序列表中,尽管您可以使用二进制搜索,即使有数百万条记录也不会花费那么长时间。

重读您对数据结构的解释,我有这个问题。如果您的初始计划是无论如何单独存储所有 Y 的列表,那么对象 X 存储对象 Y 的意义何在?为什么不能存储 X 的排序列表,其中每个 X 包含关联 Y 对象的 id 的排序列表,并且您有一个单独的 Y 对象排序列表?如果可以在不知道其相关 X 的情况下搜索 Y,那么您正在创建一个错误的数据结构来保存您的对象。或者您可以创建一个数据库并在需要时使用 SQL 来获取所需的内容,如果您有数百万条记录,这可能是一个不错的选择。

【讨论】:

  • 嗯,HashTable 的问题是需要经过几次操作(主要是 A LOT 操作)后使其变大 - 我的数据是高度动态的,并且创建一个新的 HashTable 的操作时不时可以导致非常糟糕的结果。关于 SQL - 所有数据都存储在 SQL 中。数据结构用于缓存,因为我必须有实时数据查询。 SQL 只是不会做我需要的。正如你所说,我可以反转它 - 将所有 Y 对象存储在排序列表中,并将指向它们的指针存储在 X 对象中。听起来它会执行相同的操作。
猜你喜欢
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多