已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。
3天前关闭。
截至昨天,社会正在审查是否重新讨论这个问题。
Improve this question
我正在将Rust代码翻译成C#。
Rust有一个名为Box<>
的类型,据说它是C++的智能指针的等价物。
Rust的Box<>
类型的C#等价物应该是什么?
已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。
3天前关闭。
截至昨天,社会正在审查是否重新讨论这个问题。
Improve this question
我正在将Rust代码翻译成C#。
Rust有一个名为Box<>
的类型,据说它是C++的智能指针的等价物。
Rust的Box<>
类型的C#等价物应该是什么?
2条答案
按热度按时间dl5txlt91#
简短的回答是,没有一个完全等价的类型。
Box
用于在堆上放置值。有几个原因可以解释为什么你会想要这样做,但这就是它所做的一切。在C#中,引用类型总是指向堆分配。因此,“装箱”在引用类型上是毫无意义的,因为它们已经被有效地装箱了。
C#值类型是直接分配的,要么在堆栈上,要么直接在对象的堆分配中(如果用作非静态类字段)。您可以通过将C#值类型强制转换为兼容的引用类型来将其装箱:
object
或由值类型实现的接口类型。然而,C#中的引用类型不仅仅是装箱的,它们还具有 * 共享所有权 * 以及 * 共享可变性 *,因此C#引用类型更接近于实现这些行为的Rust类型,例如
Rc<RefCell<T>>
或Arc<Mutex<T>>
,尽管这些类型和C#引用类型之间仍然存在非常相关的语义差异(Rc<_>
不能被发送到其他线程,Arc<Mutex<_>>
必须被锁定才能访问内部值,Rc
和Arc
都可以创建可能导致内存泄漏的引用循环,等等)。共享可变性特别需要某种同步/原子性,甚至通过Rust编译器,其中C#允许您创建数据竞争。换句话说,您需要查看 * 为什么 * 值被装箱。
Box<dyn _>
)上启用多态性吗?使用C#接口。czq61nw12#