Каким должен быть C#-эквивалент типа Box<> в Rust?

Я перевожу код Rust на C#.

В Rust есть тип под названием Box<>, который считается эквивалентом интеллектуальных указателей в C++.

Каким должен быть C#-эквивалент типа Box<> в Rust?

C# работает со сборщиком мусора, почти в каждом случае это будет обычный объект (ссылка).

Ry- 01.06.2023 20:35
Документы Rust ничего не говорят об «умных указателях». Они говорят, что он выделяет память в куче, а затем помещает в нее x. так что эквивалент .. a class
stuartd 01.06.2023 20:49

Что ж, чтобы «упаковать» тип значения в C#, вы должны создать переменную object и присвоить ей значение. Это создает ссылку на значение где-то в памяти. Но знать больше зависит от того, что вы делаете с коробочной переменной в Rust.

D Stanley 01.06.2023 20:57

При переводе кода редко бывает хорошей идеей начинать сопоставлять каждый тип и переменную 1:1, вместо этого смотреть, что делает код, и повторно реализовывать его на целевом языке.

cafce25 02.06.2023 07:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
111
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Здесь будет полезно пояснение. Как показано, этот ответ практически ничего не делает.

Chayim Friedman 02.06.2023 14:51
Ответ принят как подходящий

Короткий ответ заключается в том, что не существует точно эквивалентного типа.

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#, которые могут автоматически повторяться без проблем.

Другие вопросы по теме