использование 'использования' в.NET

В примере ниже, будет возвращенный pen быть уничтоженными (расположенные) или нет?

' VB'
Public Function GetPen() As System.Drawing.Pen
  Using pen As New System.Drawing.Pen(_Color, _Width)
    pen.DashStyle = _DashStyle
    Return pen
  End Using
End Function

// C#
public System.Drawing.Pen GetPen()
{
    using (System.Drawing.Pen pen = new System.Drawing.Pen(_Color, _Width)) 
    {
        pen.DashStyle = _DashStyle;
        return pen;
    }
}

[Править]

Просто еще одна точность... Объект "перо" отправлен вызывающей стороне GetPen ссылкой или 'клонирован' как структура? Я знаю, это - класс, но с объектами GDI я никогда не уверен...

Это будет уничтожено (расположил) pen созданный в GetPen() когда внешний метод Расположит pen полученный с GetPen()?

5
задан Neil N 13 January 2010 в 15:44
поделиться

11 ответов

Да, ручка будет расположена. Это действительно плохое представление; Вы возвращаете ручку, которая уже расположена!

То, что вы хотите сделать, это удалить оператор использования из GetPen. Использование оператора должно использоваться абоненты Getpen:

Using pen As Pen = GetPen()
    ''// Draw with this pen
End Using

или в C #:

using(Pen pen = GetPen())
{
    // Draw with this pen
}

[редактировать]

Да, ссылка возвращается в метод вызова, а не копию. Вот почему, если вы утилизируете ручку в Getpen, вы не можете использовать эту ручку в методе вызова; -)

из-за того, что метод GetPen и метод вызова на той же объект Pen, вам просто нужно позвонить Утилизируйте в методе вызова.

3
ответ дан 18 December 2019 в 06:50
поделиться

Pen будет не обязательно собрана "мусор", но это будет иметь, это, Располагают () названный метод.

6
ответ дан 18 December 2019 в 06:50
поделиться

Да, это будет расположено.

1
ответ дан 18 December 2019 в 06:50
поделиться

Да, это будет расположено. Вы затем возвращаете его в склонном состоянии, таким образом, это не будет хорошо работать ни для чего. Если вы захотите использовать метод фабрики как это для возврата экземпляр Pen , то необходимо будет иметь дело с расположением его сами внешне к методу, не используя использование блок в рамках метода как это.

7
ответ дан 18 December 2019 в 06:50
поделиться

Да.

Возвращенный объект пера будет расположена до того, как звонящий получает его.

В Get () [) Стильные методы, вы не хотите иметь дело с утилизацией объектов. Позвольте абоненту утилизировать объект после Они сделаны с этим. Я бы ожидал, что вызывающая функция выглядит так:

using(Pen myPen = GetPen())
{
    // My code here.
}
1
ответ дан 18 December 2019 в 06:50
поделиться

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

public System.Drawing.Pen GetPen() 
{ 
    System.Drawing.Pen pen = new System.Drawing.Pen(_Color, _Width)
    { 
        DashStyle = _DashStyle; 
    } 
    return pen; 
} 

Тогда назовите его, используя:

using (System.Drawing.Pen pen = GetPen())
{
    //Do stuff with your pen...
}
1
ответ дан 18 December 2019 в 06:50
поделиться

Похоже, вам следует apt-get install libsndfile1-dev (обратите внимание на 1).

-121--4196175-

Я бы рекомендовал установить MacVim через MacPorts ( sudo port install MacVim ).

После установки MacPorts автоматически обновляет ваш профиль, чтобы включить/opt/local/bin в ваш путь, и поэтому, когда mvim будет установлен как/opt/local/bin/mvim во время установки MacVim, вы сразу же найдете его готовым к использованию.

При установке порта MacVim пакет MacVim.app также устанавливается в/Applications/MacPorts.

Хорошей особенностью маршрута MacPorts является возможность установки git ( sudo port install git-core ) и многих других портов. Очень рекомендуем.

-121--570696-

Объект Pen будет удален до завершения возврата и оставлен с объектом pen в недопустимом состоянии.

0
ответ дан 18 December 2019 в 06:50
поделиться

Да. В версиях C # и VB.NET вашего кода метод .dispose () вызывается до возврата функции. Это не то же самое, что и уничтожают его (объект все еще существует), но для всех практических целей объект бесполезен, потому что неуправляемый ресурс, который сделал его интересным и полезным, теперь выпущен.

Правильный шаблон для использования при построении idisposable ресурса внутри функции - просто вернуть его и использовать использование объявления для вызова функции, как это:

public System.Drawing.Pen GetPen()
{
    var pen = new System.Drawing.Pen(_Color, _Width)) 
    pen.DashStyle = _DashStyle;
    return pen;
}

public void FunctionThatCallsGetPen()
{
    using (System.Drawing.Pen pen = GetPen())
    {
       //use pen here
    }
}
0
ответ дан 18 December 2019 в 06:50
поделиться

Использование является равным следующему утверждению примерно:

попробовать {

     var something = new something() ;

}

Наконец {

 if (something != null)
 { something.Dispose();}   

}

0
ответ дан 18 December 2019 в 06:50
поделиться

Это будет автоматически расположено при выполнении возврата. Используя силы использования утилизации () IPLOQUE

1
ответ дан 18 December 2019 в 06:50
поделиться

Джаред Оберхаус ответил на этот вопрос на , связанный с этим , специфичный для Java.

В основном есть несколько шагов, которые вы можете предпринять, чтобы сделать разумное предположение, но в конечном итоге это просто догадка без явного индикации. (Отсюда (в) знаменитом BOM маркер в файлах UTF-8)

-121--3404126-

Ручка будет расположена перед возвратом. Его эквивалент

public System.Drawing.Pen GetPen()
{
    try
    {
      System.Drawing.Pen pen = new System.Drawing.Pen(_Color, _Width);

      pen.DashStyle = _DashStyle;
    }
    finally
    {
      pen.Dispose();
    }
    return pen;

}
3
ответ дан 18 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: