Rust的Box< >类型的C#等价物应该是什么?[关闭]

i2loujxw  于 2023-06-06  发布在  C#
关注(0)|答案(2)|浏览(396)

已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。

3天前关闭。
截至昨天,社会正在审查是否重新讨论这个问题。
Improve this question
我正在将Rust代码翻译成C#。
Rust有一个名为Box<>的类型,据说它是C++的智能指针的等价物。
Rust的Box<>类型的C#等价物应该是什么?

dl5txlt9

dl5txlt91#

简短的回答是,没有一个完全等价的类型。
Box用于在堆上放置值。有几个原因可以解释为什么你会想要这样做,但这就是它所做的一切。
在C#中,引用类型总是指向堆分配。因此,“装箱”在引用类型上是毫无意义的,因为它们已经被有效地装箱了。
C#值类型是直接分配的,要么在堆栈上,要么直接在对象的堆分配中(如果用作非静态类字段)。您可以通过将C#值类型强制转换为兼容的引用类型来将其装箱:object或由值类型实现的接口类型。
然而,C#中的引用类型不仅仅是装箱的,它们还具有 * 共享所有权 * 以及 * 共享可变性 *,因此C#引用类型更接近于实现这些行为的Rust类型,例如Rc<RefCell<T>>Arc<Mutex<T>>,尽管这些类型和C#引用类型之间仍然存在非常相关的语义差异(Rc<_>不能被发送到其他线程,Arc<Mutex<_>>必须被锁定才能访问内部值,RcArc都可以创建可能导致内存泄漏的引用循环,等等)。共享可变性特别需要某种同步/原子性,甚至通过Rust编译器,其中C#允许您创建数据竞争。
换句话说,您需要查看 * 为什么 * 值被装箱。

  • 它是在一组异构值(Box<dyn _>)上启用多态性吗?使用C#接口。
  • 是为了实现递归结构吗?只需使用C#类,它可以自递归而不会有问题。
czq61nw1

czq61nw12#

public class Box<T>(T val) {
    public T _val = val;
}

相关问题