Я перевожу код Rust на C#.
В Rust есть тип под названием Box<>, который считается эквивалентом интеллектуальных указателей в C++.
Каким должен быть C#-эквивалент типа Box<> в Rust?
classЧто ж, чтобы «упаковать» тип значения в C#, вы должны создать переменную object и присвоить ей значение. Это создает ссылку на значение где-то в памяти. Но знать больше зависит от того, что вы делаете с коробочной переменной в Rust.
При переводе кода редко бывает хорошей идеей начинать сопоставлять каждый тип и переменную 1:1, вместо этого смотреть, что делает код, и повторно реализовывать его на целевом языке.





public class Box<T>(T val) {
public T _val = val;
}
Здесь будет полезно пояснение. Как показано, этот ответ практически ничего не делает.
Короткий ответ заключается в том, что не существует точно эквивалентного типа.
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# работает со сборщиком мусора, почти в каждом случае это будет обычный объект (ссылка).