Правильно ли я использую оператор "using"? - PullRequest
2 голосов
/ 11 февраля 2011

Я хотел бы знать, правильно ли я использую using. В нормативе using я решаю, следует ли использовать изображение в игре.

Image imageOfEnemy;
using(imageOfEnemy=Bitmap.FromFile(path))
{
   // some stuff with the imageOfEnemy variable

}

Насколько я понимаю, мне не нужно звонить Dispose сейчас.

Ответы [ 4 ]

9 голосов
/ 11 февраля 2011

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

using(var imageOfEnemy = Bitmap.FromFile(path))
{
    // some stuff with the imageOfEnemy variable
}

, что примерно эквивалентно:

{
    var imageOfEnemy = Bitmap.FromFile(path);
    try 
    {
        // some stuff with the imageOfEnemy variable
    }
    finally 
    {
        ((IDisposable)imageOfEnemy).Dispose();
    }
}
0 голосов
/ 11 февраля 2011

Да, действительно, вы используете это правильно. Всегда помните, что это полезно, когда объект, который вы устанавливаете, и использует его для реализации IDisposable. Это действительно маленькая вещь, которую CLR делает для нас и делает код чище. VB.Net также теперь поддерживает это заявление. Насколько мне известно, нет разницы в скорости между оператором using объектов closin, использующих блок try catch, но я бы порекомендовал оператор usins ​​вместо try-catch, более чистого кода, и вы не рискуете забыть избавиться от объектов или потерпеть неудачу, потому что вы это сделали не поймать исключение

0 голосов
/ 11 февраля 2011

с использованием является сокращенным выражением для объектов IDisposable для упрощения блока try-finally с Dispose в блоке finally.

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

Так что да, вам не нужно вызывать Dispose в этом случае вручную.

using System;
namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var example = new Example())
            {
                //do something
            }
        }
    }

    class Example : IDisposable
    {

        public void Dispose()
        {
            //Do something
        }
    }
}

Основной метод будет таким в MSIL:

.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 2
    .locals init (
        [0] class ConsoleApplication3.Example example,
        [1] bool CS$4$0000)
    L_0000: nop 
    L_0001: newobj instance void ConsoleApplication3.Example::.ctor()
    L_0006: stloc.0 
    L_0007: nop 
    L_0008: nop 
    L_0009: leave.s L_001b
    L_000b: ldloc.0 
    L_000c: ldnull 
    L_000d: ceq 
    L_000f: stloc.1 
    L_0010: ldloc.1 
    L_0011: brtrue.s L_001a
    L_0013: ldloc.0 
    L_0014: callvirt instance void [mscorlib]System.IDisposable::Dispose()
    L_0019: nop 
    L_001a: endfinally 
    L_001b: nop 
    L_001c: ret 
    .try L_0007 to L_000b finally handler L_000b to L_001b
}

Вы можете увидеть обработчик try-finally и вызов Dispose, даже если вы новичок в MSIL.

0 голосов
/ 11 февраля 2011

Это правильно, если Image реализует интерфейс IDisposable. Оператор using позволяет программисту указать, когда объекты, использующие ресурсы, должны их освобождать. Объект, предоставленный оператору using, должен реализовывать интерфейс IDisposable. Этот интерфейс предоставляет метод Dispose, который должен высвобождать ресурсы объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...