Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/170: Рейтинг темы: голосов - 170, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 11.11.2015
Сообщений: 29

Для чего нужен оператор using и в каких случаях он необходим?

10.08.2016, 22:29. Показов 32774. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Несколько раз сталкивался в C# с оператором using. Но не могу понять для чего он нужен. Сейчас разбираюсь с opencvsharp. Нашел в интернете один необходимый мне пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using OpenCvSharp;
namespace OpenCV
{
    class Program
    {
        [STAThread]
        static void Main()
        {
            using (CvCapture cap = CvCapture.FromCamera(2))
            using (CvWindow w = new CvWindow("OpenCV Example"))
            {
                while (CvWindow.WaitKey(10) < 0)
                {
                    using (IplImage src = cap.QueryFrame())
                    using (IplImage gray = new IplImage(src.Size, BitDepth.U8, 1))
                    using (IplImage dstCanny = new IplImage(src.Size, BitDepth.U8, 1))
                    {
                        src.CvtColor(gray, ColorConversion.BgrToGray);
                        Cv.Canny(gray, dstCanny, 50, 50, ApertureSize.Size3);
                        w.Image = dstCanny;
                    }
                }
            }
        }
    }
}
Но вот не понимаю зачем там используется оператор using если при замене этого кода на
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System.Windows.Forms;
using OpenCvSharp;
using OpenCvSharp.Extensions;
 
namespace Bridge
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            OpenFileDialog open = new OpenFileDialog();
            if (open.ShowDialog() == DialogResult.OK)
            {
                IplImage img = IplImage.FromFile(open.FileName);
                IplImage gray = new IplImage(img.Size, BitDepth.U8, 1);
                IplImage dstCanny = new IplImage(img.Size, BitDepth.U8, 1);
                img.CvtColor(gray, ColorConversion.BgrToGray);
                Cv.Canny(gray, dstCanny, 50, 50, ApertureSize.Size3);
                p1.Image = dstCanny.ToBitmap();
            }
        }
    }
}
ничего не меняется.
Программы немного разные, но на всякий случай привел полный код, хотя от него вроде не зависит использование оператора в данном случае.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.08.2016, 22:29
Ответы с готовыми решениями:

В каких случаях Вы используете экспорт шаблонов и для чего?
И в каких книгах подробно описано использование экспорта шаблонов в C++.

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

Для чего нужен оператор двоеточие, если два двоеточия - это оператор расширения области видимости
для чего нужен оператор двоеточие ( : ), если два двоеточия( :: ) - это оператор расширения области видимости.

10
 Аватар для Prizrak86
52 / 52 / 18
Регистрация: 20.03.2015
Сообщений: 278
10.08.2016, 22:50
представь что ты работаешь с файлом, ты его открыл, что-то пишешь туда, и возникла ошибка которую ты ни как не отлавливал, файл твой не сохраняется и все летит к чертям. А мы помним что файловые потоки нужно закрывать, так вот, юзинг конструкция это делает все сама, закрывает поток и в случае удачного и в случае неудачного работы блока кода, завершает она поток корректно.
3
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.08.2016, 22:58
Лучший ответ Сообщение было отмечено Евгений Р как решение

Решение

Цитата Сообщение от Евгений Р Посмотреть сообщение
не могу понять для чего он нужен.
Он нужен для того, чтобы каждый раз не писать вот такое:
C#
1
2
3
4
5
6
7
8
9
10
11
CvCapture cap = null;
try
{
   cap = CvCapture.FromCamera(2);
   ... Ваш код
}
finally
{
   if (cap != null)
      cap.Dispose();
}
Блок using разворачивается компилятором в вышеприведенную конструкцию для вашего удобства.
3
 Аватар для Prizrak86
52 / 52 / 18
Регистрация: 20.03.2015
Сообщений: 278
10.08.2016, 23:01
Цитата Сообщение от kolorotur Посмотреть сообщение
Он нужен для того, чтобы каждый раз не писать вот такое:
ну или так думаю проще будет. правильно ли что это юзинг конструкцию называют потокобезопасной конструкцией?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.08.2016, 23:03
Цитата Сообщение от Prizrak86 Посмотреть сообщение
правильно ли что это юзинг конструкцию называют потокобезопасной конструкцией?
Нет, потокобезопасность — это про синхронизацию нескольких потоков (тех, которые Thread, а не Stream) при доступе к общему ресурсу.
1
 Аватар для Prizrak86
52 / 52 / 18
Регистрация: 20.03.2015
Сообщений: 278
10.08.2016, 23:06
спасибо, совсем все подзабыл.
0
6 / 6 / 0
Регистрация: 23.05.2013
Сообщений: 33
11.08.2016, 00:22
В C# пространство имен определяет область объявлений. Благодаря пространству имен одно множество имен отделяется от других. По существу, имена, объявляемые в одном пространстве имен, не вступают в конфликт с именами, объявляемыми в другом пространстве имен.
0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
22.03.2017, 13:25
kolorotur, вот кусок кода. куда здесь вставить Using?
C#
1
2
3
4
5
6
7
8
9
            // открываем файл для чтения  (cоздаём и инициализируем (экземпляр класса FileStream, file - это ссылка нв экземпляр класса FileStream)
            FileStream file = File.Open("test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
            // Создаём поток для чтения данных из файла и конфигурируем его экземпляром класса FileStream
            StreamReader reader = new StreamReader(file);
            // Читаем до конца
            listBox1.Items.Add(reader.ReadToEnd());
            // закрываем файл и удаляем поток
            reader.Close();
            // file.Close(); закрывать не обязательно, так как reader.Close(); закроет файл автоматически
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
22.03.2017, 13:49
jkrnd,
C#
1
2
3
4
using (var reader = new StreamReader(File.Open("test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)))
{
    listBox1.Items.Add(reader.ReadToEnd());
}
Или воообще без using и явного создания потоков
C#
1
listBox1.Items.Add(File.ReadAllText("test.txt"));
2
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
22.03.2017, 15:31
OwenGlendower, Спасибо. Мне было важно открывать файл именно с атрибутами. Всё понял.

Добавлено через 1 час 32 минуты
OwenGlendower, а если using будет внутри какой-то процедуры и внутри операторных скобок using произойдёт принудительный выход из самой (внешней) процедуры, файл и поток закроются?
VB.NET
1
2
3
4
5
6
7
8
9
10
private bool subproc()
        {
            using (var reader = new StreamReader(File.Open("test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)))
            {
                //listBox1.Items.Add(reader.ReadToEnd());
                //...
                return false; 
                //...
            }
        }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
22.03.2017, 15:38
Цитата Сообщение от jkrnd Посмотреть сообщение
а если using будет внутри какой-то процедуры и внутри операторных скобок using произойдёт принудительный выход из самой (внешней) процедуры, файл и поток закроются?
Да. Потому что компилятор превращает блок using в блок try/finally. Примерно так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private bool subproc()
{
    {
        StreamReader reader = new StreamReader(File.Open("test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite));
        try
        {   
            //listBox1.Items.Add(reader.ReadToEnd());
            //...
            return false; 
            //...
        }
        finally
        {
            reader.Dispose();
        }
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.03.2017, 15:38
Помогаю со студенческими работами здесь

В каких случаях при описании записи используется оператор варианта(case)
в каких случаях при описании записи используется оператор варианта(case)? в паскале

Для чего нужен оператор this?
Здравствуйте. Я совсем новичок. Недавно стал смотреть видео курс на ютубе. Дошел до прототипов. Саму тему вроде понял и вопрос не о них, а...

Для чего нужен оператор throw?
Объясните пожалуйста. А то в интернете найти ничего не могу. P.S. В MDSN непонятно написано.

Для чего нужен оператор lock?
для чего нужен оператор lock? в смысле я уже загуглил - он заставляет код выполняться синхронно, но ведь код и так выполняется синхронно...

Нюансы синтаксиса: для чего нужен оператор ->
Здравствуйте совсем недавно столкнулся с вот таким вот оператором. -&gt; . Подскажите пожалуйста, что он делает? card *bus_park(nullptr);...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru