C # 7.0 - Сбрасывает и IDisposable out аргумент - PullRequest
0 голосов
/ 15 декабря 2018

Правильно ли работает функция Discards для объектов IDisposable?

Вызывается ли Dispose();, когда это необходимо?


У меня есть код:

Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: out Mutex _);

Здесь мне нужно только existing значение переменной.

Как видите, я пытаюсь использовать здесь переменную "discard", но я не уверен, что это правильное использование в этом случае или нет.

Из-за Mutex obj реализует IDisposable.

Так какой путь будет правильным в этом случае?это:

Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: out Mutex _);

или это:

Mutex mutex; 
Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: mutex);
mutex.Dispose();

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Я создал тестовое приложение, чтобы проверить ответ @CamilioTerevinto.

Простое приложение winforms с методом:

public bool TestMethod(out Image bmp)
{
    Thread.Sleep(3000);

    bmp = Bitmap.FromFile(@"C:\Users\UKS\Desktop\2000x2000pixels.bmp");

    Thread.Sleep(1000);

    return true;
}

Давайте попробуем код:

public Form1()
{
    InitializeComponent();
    Image img;
    var a = TestMethod(out img);
    img.Dispose();
}

enter image description here

Мы видим ожидаемое поведение - изображение было удалено, а память свободна.

Давайте попробуем следующий код:

public Form1()
{
    InitializeComponent();
    var a = TestMethod(out _);
}

test 2

Как мы видим, изображение не было уничтожено.Память не была свободной.

Таким образом, Discard не вызывает Dispose ();Метод.

Давайте попробуем еще несколько тестов:

Конструкция:

var a = TestMethod(out _.Dispose());

Не будет работать.Это говорит о том, что _ не существует в текущем контексте.

Consttruction:

var a = TestMethod(out _);
_.Dispose();

Будет делать тот же результат.

Итак ....

Discards некорректно работает с аргументом IDisposable out.Вам нужно явно позвонить .Dispose().

0 голосов
/ 15 декабря 2018

Насколько я понимаю,

Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: out Mutex _);

откажется от Mutex, сгенерированного вызовом.Отказ от него не означает, что будет вызван какой-то метод, например Dispose().
Вам нужно явно вызвать .Dispose().

Я бы просто продолжил использовать

Mutex mutex; 
Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: mutex);
mutex.Dispose();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...