Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2012, 10:55   #11
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Насчёт метода Dispose я так и не понял
Это после прочтения по ссылке? или не читали вовсе?
eval вне форума Ответить с цитированием
Старый 19.10.2012, 12:31   #12
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Смотрите, все просто.
увас в коде:
Код:
BinaryWriter bw = new BinaryWriter(File.OpenWrite(path));
bw.Write('c');
bw.Close();
, если обламается на bw.Write('c'); то клоз не сработает, и что? ресурсы повиснут в воздухе, а это капец.
чтобы этого не произошло надо защитить:
Код:
BinaryWriter bw = new BinaryWriter(File.OpenWrite(path));
try
{
bw.Write('c');
}
finally
{
bw.Close();
}
вот уже ништяк.
но, из справки мы узнали (а мы это узнали, не правда ли?) что BinaryWriter имплементирует IDisposable, а следовательно его можно запихнуть в using, а using обеспечивает то, что на выходе из его области, не важно по какой причине, всегда вызывается метод Dispose.
Все, праздник танцы и хороводы...

PS: Dispose можно вызвать если явно привести к IDisposable.

Последний раз редактировалось eval; 19.10.2012 в 12:36.
eval вне форума Ответить с цитированием
Старый 20.10.2012, 15:43   #13
GeorgeLucas
Пользователь
 
Аватар для GeorgeLucas
 
Регистрация: 20.10.2012
Сообщений: 11
По умолчанию

Вам правильно советуют, используйте конструкцию вида using (BinaryReader reader = new BinaryReader...

В этом случае, если где то в коде вылетит ексепшин, то ресурсы будут гарантированно освобождены и файл не подвиснет в заблокированном состоянии.
GeorgeLucas вне форума Ответить с цитированием
Старый 24.10.2012, 09:39   #14
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Теперь понял, что можно двумя равноправными способами написать:

Оператор using:



Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace DisposeInsideTheUsing
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string path;
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                button2.Enabled = true;
                path = ofd.FileName;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            using (BinaryWriter bw = new BinaryWriter(File.OpenWrite(path)))
            {
                bw.Write('c');
            }
        }
    }
}
try{}...finally{}, Close():



Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace CloseAndTry
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string path;
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                button2.Enabled = true;
                path = ofd.FileName;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            BinaryWriter bw = new BinaryWriter(File.OpenWrite(path));
            try
            {
                bw.Write('c');
            }
            finally
            {
                bw.Close();
            }
        }
    }
}
Я так и не нашёл в справке ответа на главный свой вопрос: почему следующий код не работает в VC# 2008, но работает в VC# 2010?

Я понимаю, что ответ кроется в весии Framework'a. Где это явно увидеть в документации? Дайте ссылку, пожалуйста. Я не могу найти ответа.

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Dispose
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string path;
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                button2.Enabled = true;
                path = ofd.FileName;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            BinaryWriter bw = new BinaryWriter(File.OpenWrite(path));
            bw.Write('c');
            bw.Dispose();
        }
    }
}

Последний раз редактировалось 8Observer8; 24.10.2012 в 09:50.
8Observer8 вне форума Ответить с цитированием
Старый 24.10.2012, 10:39   #15
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

http://msdn.microsoft.com/ru-ru/library/dd383502.aspx см. секцию супортед версий.
eval вне форума Ответить с цитированием
Старый 24.10.2012, 11:05   #16
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
http://msdn.microsoft.com/ru-ru/library/dd383502.aspx см. секцию супортед версий.
Ивините, я не тот пример привёл: http://msdn.microsoft.com/en-us/libr...(v=vs.90).aspx



Из первого моего сообщения:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace BrDispose
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string path;
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                button2.Enabled = true;
                path = ofd.FileName;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            BinaryReader br = new BinaryReader(File.OpenRead(path));
            br.BaseStream.Position = 0x6;
            textBox1.Text = br.ReadInt16().ToString();
            br.Dispose();
        }
    }
}

Последний раз редактировалось 8Observer8; 24.10.2012 в 11:10.
8Observer8 вне форума Ответить с цитированием
Старый 24.10.2012, 11:11   #17
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

ну так он тут во первых имеет другую сигнатуру, да и еще и защищен (protected)
protected virtual void Dispose(bool disposing)
это в 4 сделали доп. метод, открытый. Вернее он и там тоже есть, только не открытый (poublic). да и скорее всего експлицит.

Последний раз редактировалось eval; 24.10.2012 в 11:13.
eval вне форума Ответить с цитированием
Старый 24.10.2012, 11:18   #18
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Спасибо! Есть пища для размышлений, теперь буду переваривать
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Так уж пхп недоступен Ципихович Эндрю Свободное общение 9 16.09.2012 14:00
не работает dispose MYriad Помощь студентам 1 02.10.2011 14:19
Как обозначается NEW и DISPOSE в блоксхеме??? Андрю)(@ Паскаль, Turbo Pascal, PascalABC.NET 1 08.12.2008 21:15
Почему Dispose не освобождает память? DeLorean Общие вопросы Delphi 4 08.04.2008 00:17