В примере ниже, будет возвращенный 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()
?
Да, ручка будет расположена. Это действительно плохое представление; Вы возвращаете ручку, которая уже расположена!
То, что вы хотите сделать, это удалить оператор использования из 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, вам просто нужно позвонить Утилизируйте в методе вызова.
Pen будет не обязательно собрана "мусор", но это будет иметь, это, Располагают () названный метод.
Да, это будет расположено. Вы затем возвращаете его в склонном состоянии, таким образом, это не будет хорошо работать ни для чего. Если вы захотите использовать метод фабрики как это для возврата экземпляр Pen
, то необходимо будет иметь дело с расположением его сами внешне к методу, не используя использование
блок в рамках метода как это.
Да.
Возвращенный объект пера будет расположена до того, как звонящий получает его.
В Get () [)
Стильные методы, вы не хотите иметь дело с утилизацией объектов. Позвольте абоненту утилизировать объект после Они сделаны с этим. Я бы ожидал, что вызывающая функция выглядит так:
using(Pen myPen = GetPen())
{
// My code here.
}
Ваш код должен быть структурирован по-другому, потому что вы возвращаете объект, который затем немедленно утилизируется.
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...
}
Похоже, вам следует apt-get install libsndfile1-dev
(обратите внимание на 1).
Я бы рекомендовал установить 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
) и многих других портов. Очень рекомендуем.
Объект Pen
будет удален до завершения возврата и оставлен с объектом pen в недопустимом состоянии.
Да. В версиях 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
}
}
Использование является равным следующему утверждению примерно:
попробовать {
var something = new something() ;
}
Наконец {
if (something != null)
{ something.Dispose();}
}
Это будет автоматически расположено при выполнении возврата. Используя силы использования утилизации () IPLOQUE
Джаред Оберхаус ответил на этот вопрос на , связанный с этим , специфичный для 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;
}