Nano Hash - криптовалюты, майнинг, программирование

Что означает "Использование () {}"

Возможные дубликаты:
Использование статуса using в C #
Что такое блок C # Using и зачем его использовать?

Просто интересно, что это значит? Я видел множество онлайн-руководств, имеющих синтаксис:

using (SqlCeCommand cmd2 = new SqlCeCommand("SELECT city FROM cities JOIN states ON states.id=cities.state WHERE states.state='" + read.GetString(0) + "'", con))
{
  SqlCeDataReader readCities = cmd2.ExecuteReader();
  while (readCities.Read())
  {
    parent.Nodes.Add(readCities.GetString(0));
  }
}

Почему это используется? Я попытался выполнить поиск в Google, но он обнаружил ключевое слово using, которое используется для включения dll и других файлов.


  • См. Раздел 8.13 спецификации C #. 26.01.2010
  • См. Этот ответ: stackoverflow.com/questions/ 614959 / 26.01.2010
  • Как правило, при поиске ответа на вопрос о том, что означает ключевое слово, языковая спецификация намного эффективнее, чем Google. Просто говорю. 26.01.2010
  • Вы также можете попробовать быстрый поиск здесь на SO, и вы обнаружите, что создали повторяющийся вопрос. 26.01.2010
  • Зано: Возможно, здесь это ему не очень помогло, в зависимости от того, знал ли он, что искал. В C # ключевое слово using имеет два совершенно разных значения. 26.01.2010
  • Я сомневаюсь, что большинство разработчиков вообще осознают, что спецификация C # существует. 28.01.2010
  • Только что проголосовали за открытие. Этот вопрос похож на другие вопросы, но не является точным дубликатом, поскольку он касается причины его использования. 03.12.2010
  • Только что номинирован на повторное открытие, потому что на другие вопросы нет ответа, правильного в отношении сгенерированного кода (в частности, использование IDisposable.Dispose вместо Dispose непосредственно в классе, который может быть другим, и обработка null . 28.07.2012

Ответы:


1

Заявление using

using(var disposableObject = new object_that_implements_IDisposable()) { ... }

синтаксический сахар для кода, подобного следующему:

var disposableObject = new object_that_implements_IDisposable()
try
{
    ...
}
finally
{
    if(disposableObject != null)
    {
        ((IDisposable)your_object).Dispose();
    }
}

Это только применимо для классов, реализующих IDisposable. Это полезно для очистки кода, где у вас есть объекты, которые, например, занимают системные ресурсы (дескрипторы файлов, соединения с базой данных, сокеты и т. Д.), Которые необходимо очистить после того, как вы закончите, чтобы освободить ресурс для остальной части система.

Теоретически вы можете пропустить вызов .Dispose(), но тогда вам придется подождать, пока сборщик мусора освободит сохраненные ресурсы. Сборщик мусора прекрасно знает, когда освобождать объекты, чтобы восстановить использование ими памяти, но он понятия не имеет, что ему нужно освободить объекты, чтобы они отказались от других системных ресурсов. Таким образом, эти критические ресурсы не могут быть предоставлены до тех пор, пока сборщик мусора не решит, что ему нужна память, используемая владельцем. Таким образом, вы определенно захотите утилизировать свои объекты, когда закончите с ними (если они одноразовые)!

Что касается того, почему вы бы использовали using вместо _6 _ / _ 7_, это чисто предпочтение программиста. Я предпочитаю using, потому что их можно каскадировать:

using(var a = new class())
using(var b = new class())
using(var c = new class())
using(var d = new class())
{
    ...
}

Для этого с _10 _ / _ 11_ вам понадобится еще несколько строк кода.

using также имеет дополнительные преимущества. Например, в то время как вызов x.Dispose напрямую может выдать NullReferenceException, если x имеет значение null, using(x) не будет.

Смотрите также:

25.01.2010
  • Ключ в том, что вам придется подождать, пока сборщик мусора освободит сохраненные ресурсы. +1 26.01.2010
  • При выходе из блока using будет вызываться IDisposable.Dispose. Это может отличаться от метода Dispose, определенного для вашего объекта, если вы также явно определили IDisposable.Dispose. 26.01.2010
  • Спасибо за редактирование, исправляющее размещение объявления и инициализацию переменной перед попыткой. Удален мой комментарий, указывающий на недостаток. 27.01.2010
  • +1 Не знал о трюке с каскадным синтаксисом. 03.12.2010

  • 2

    using просто инструктирует компилятор написать код, который будет вызывать метод Dispose для переменной, которую вы используете. С операторами using можно использовать только типы, реализующие 'IDisposable'.

    В вашем примере cmd2 будет удален, когда код в {} завершится.

    25.01.2010
  • Хорошо, я понимаю это, но почему это сформулировано так? На мой взгляд, using не передает Hey Compiler please clean up after me? 18.07.2017

  • 3

    «Определяет область, за пределами которой объект или объекты будут удалены»
    См. оператор using

    25.01.2010

    4

    using применяется к объектам, реализующим IDisposable. Он гарантирует, что при выходе из блока using (обычно или через исключение или что-то еще) вызывается метод Dispose одноразового объекта.

    25.01.2010

    5

    Оператор using определяет область, за пределами которой объект или объекты будут размещены.

    25.01.2010

    6

    Использование - это отличный способ очистки ресурсов, он эквивалентен попытке {} catch {} finally {dispose}. В Effective C # есть пункт на этот счет, и я уверен, что вы получите более 10 похожих ответов.

    https://rads.stackoverflow.com/amzn/click/com/0321245660

    25.01.2010

    7

    См. http://msdn.microsoft.com/en-us/library/yh598w02(VS.80).aspx.

    Оператор using инкапсулирует переменные внутри себя в области видимости. Когда выполнение выходит из блока using, все объекты внутри него удаляются из памяти. Вы можете увидеть это с соединениями с БД, так что при выходе из блока using ресурсы, выделенные для этого соединения, очищаются и закрываются.

    25.01.2010

    8

    Оператор using определяет область, в которой следует использовать объект, реализующий интерфейс IDisposable. После выхода из блока объект будет очищен. Видеть:

    http://msdn.microsoft.com/en-us/library/yh598w02.aspx

    25.01.2010
  • всегда тот, который реализует IDisposable 27.01.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..