Почему не там никакой RAII в.NET?

Начиная с iOS 5, симулятор имеет настраиваемое местоположение.

В меню «Отладка» последняя запись «Местоположение»; это дает вам подменю с:

  • None
  • Пользовательское местоположение
  • Apple Store
  • Apple
  • City Bicycle Ride
  • City Run
  • Freeway Drive

Пользовательское местоположение позволяет ввести значение Lat / Long.

Конечно, это не помогает при отладке для iOS 4 (или ранее); но это определенное улучшение!

64
задан Motti 6 October 2008 в 19:44
поделиться

6 ответов

Лучший заголовок был бы, "Почему не там никакой RAII в C#/VB". C++ / CLI (Эволюция прерывания, которое было Управляемым С++) имеет RAII в том же самом смысле как C++. Это - все просто сахар синтаксиса для того же шаблона завершения, что остальная часть использования языков CLI (Деструкторы в управляемых объектах для C++ / CLI являются эффективно финализаторами), но это там.

Вам могло бы понравиться http://blogs.msdn.com/hsutter/archive/2004/07/31/203137.aspx

16
ответ дан CharlesB 7 November 2019 в 12:20
поделиться

Самым близким, который Вы получаете к этому, является очень ограниченный stackalloc оператор.

1
ответ дан leppie 7 November 2019 в 12:20
поделиться

Можно сделать, форма RAII в .NET и использовании Java завершает () методы. Завершение () перегрузку называют, прежде чем класс очищен GC и так может использоваться для чистки любых ресурсов, которые абсолютно не должны быть сохранены классом (взаимные исключения, сокеты, дескрипторы файлов, и т.д.). Это все еще не детерминировано все же.

С.NET можно сделать часть этого детерминировано с интерфейсом IDisposable и ключевым словом использования, но это действительно имеет ограничения (использующий конструкцию при использовании требуемый для детерминированного поведения, все еще никакое детерминированное освобождение памяти, не автоматически используемое в классах, и т.д.).

И да, я чувствую, что существует место для идей RAII, которые будут введены в.NET и другие управляемые языки, хотя точный механизм мог быть обсужден бесконечно. Единственная другая альтернатива, которую я видел, должна будет представить GC, который мог обработать произвольную очистку ресурса (не только память), но и затем у Вас есть проблемы, когда упомянутые средства абсолютно должны быть высвобождены детерминировано.

-3
ответ дан workmad3 7 November 2019 в 12:20
поделиться

Превосходный вопрос и тот, который побеспокоил меня значительно. Кажется, что преимущества RAII восприняты очень по-другому. По моему опыту, с.NET, отсутствием детерминированных (или по крайней мере надежный) набор ресурса является одним из главных недостатков. На самом деле.NET вынуждала меня несколько раз использовать целую архитектуру для контакта с неуправляемыми ресурсами, которые могли бы (но не мог бы) требовать явного сбора. Который, конечно, является огромным недостатком, потому что он делает полную архитектуру более трудной и обращает внимание клиента далеко от более центральных аспектов.

14
ответ дан Konrad Rudolph 7 November 2019 в 12:20
поделиться

Существуют некоторые подобные потоки, если Вы ищете их, но basicly, к чему это сводится, - то, что, если Вы хотите к RAII на.NET просто, реализуют тип IDisposable и используют оператор "использования" для получения детерминированного Распоряжения. Тем путем многие из тех же идиом могут реализовываться и использоваться только немного более многословным способом.

1
ответ дан Torbjörn Gyllebring 7 November 2019 в 12:20
поделиться

У Brian Harry есть хорошее сообщение об объяснениях здесь .

Вот выборка:

Что относительно детерминированного завершения и значения вводит (структуры)?

--------------я видел много вопросов о структурах, имеющих деструкторы и т.д. Это стоит комментария. Существует множество проблем для того, почему некоторые языки не имеют их.

(1) состав - Они не дают Вам детерминированное время жизни в общем случае для тех же видов причин состава, описанных выше. Любой недетерминированный класс, содержащий, нельзя было бы назвать деструктор, пока он не был завершен GC так или иначе.

(2) конструкторы копии - одно место, где это действительно было бы хорошо, находится в выделенных местных жителях стека. Они были бы ограничены по объему к методу, и все будут великими. К сожалению, чтобы заставить это действительно работать, также необходимо добавить конструкторов копии и назвать их каждым разом, когда экземпляр копируется. Это - одна из самых ужасных и самых сложных вещей о C++. Вы заканчиваете тем, что получили код, выполняющийся повсеместно, где Вы не ожидаете это. Это вызывает наборы проблем языка. Некоторые разработчики языка приняли решение избегать этого.

Скажем, мы создали структуры с деструкторами, но добавили набор ограничений для создания их поведения разумным перед лицом проблем выше. Ограничения были бы чем-то как:

(1) можно только объявить их как локальные переменные.

(2) можно только пройти мимо них - касательно [1 110]

(3) Вы не можете присвоить им, можно только получить доступ к полям и назвать методы на них.

(4) Вы не можете упаковать их.

(5) проблемы с помощью них посредством Отражения (позднее связывание), потому что это обычно включает упаковку.

, возможно, больше, но это - хорошее начало.

, Каково использование эти вещи было бы? Вы на самом деле создали бы файл или класс соединения с базой данных, который может ТОЛЬКО использоваться в качестве локальной переменной? Я не полагаю, что кто-либо действительно был бы. Что Вы сделали бы, вместо этого, создают соединение общего назначения и затем создают автоматическую разрушенную обертку для использования в качестве ограниченной по объему локальной переменной. Вызывающая сторона затем выбрала бы то, что они хотели использовать. Обратите внимание, что вызывающая сторона приняла решение, и это не полностью инкапсулируется в самом объекте. Учитывая, что Вы могли использовать что-то как предложения, подходящие в нескольких разделах.

замена для RAII в.NET является шаблоном использования, который работает почти также, после того как Вы привыкаете к нему.

14
ответ дан Rasmus Faber 7 November 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: