Priya-Kiko Ответов: 2

Как объект font утилизируется при использовании в переменной font


Уважаемые Профессионалы,

У меня есть такой код в C# приложения WinForms:

{
Шрифт сайт myfont = новый шрифт ("Arial", 12);
.... какой-то код с сайт myfont

myfont = новый шрифт ("Times New Roman", 8);
.... какой-то другой код с myfont

.
.
.
}

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

Заранее спасибо.

Что я уже пробовал:

Попробовал поискать в google и почитать документацию по сборке мусора, но так и не получил ясного представления о том, чего я хочу.

2 Ответов

Рейтинг:
14

0x01AA

Я лично последовал бы предложению MSDN: Шрифт.Метод Dispose (Системы.Рисование)[^]

Видишь там Замечания, Записка:

Цитата:
Всегда вызывайте Dispose перед тем, как выпустить последнюю ссылку на шрифт. В противном случае ресурсы, которые он использует, не будут освобождены до тех пор, пока сборщик мусора не вызовет метод Finalize объекта Font.


Priya-Kiko

Спасибо за ответ.

Я сослался на это. Я сомневаюсь, что каждая строка должна содержать Dispose (), как это :

{
Шрифт myFont = новый шрифт ("Arial", 12);
.... какой-то код с myFont
сайт myfont.Распоряжаться();

myFont = новый шрифт ("Times New Roman", 8);
.... какой-то другой код с myfont
сайт myfont.Располагать();

.
.
.
}

или достаточно, если я сделаю myFont. Dispose () только в конце один раз.

Пожалуйста, уточните.. Спасибо

0x01AA

Моя интерпретация "Всегда вызов Располагать прежде чем вы отпустите свою последнюю ссылку на шрифт", это нужно сделать в каждой строке. Почему? В вашем примере вы используете ту же переменную (reference) и так, во время второго myFont= ... вы теряете ссылку на первый созданный шрифт и не имеете возможности избавиться от него.
Наконец, да, распорядитесь им так, как вы показываете это в своем комментарии.

Priya-Kiko

Спасибо вам 0x01AA.

0x01AA

Добро пожаловать.

Maciej Los

5ед!

0x01AA

Спасибо, Мацей.

Рейтинг:
10

BillWoodruff

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

а. в приложении широко, или форма широкая, сфера создавать экземпляры шрифтов, которые вы собираетесь использовать.

б. используйте их

c. когда приложение закроется, шрифты будут собраны в мусор.

d. Если вы действительно параноик по поводу удаления шрифтов:

using (Font arial12 = new Font("Arial",12))
{
      // use the Font
}
Я еще никогда не видел приложения WinForms, которое требовало бы явного удаления шрифтов.

См. это обсуждение на StackOverFlow для получения более подробной информации о том, что такое шрифт на самом деле, и о проблемах, связанных с " утилизацией шрифтов: [^]. Вы также можете быть заинтересованы в обсуждении здесь [^].

Обратите внимание, что у вас может не быть возможности управлять тем, как некоторые из ваших элементов управления WinForm внутренне управляют шрифтами (например, RichTextBox, TreeView).


Richard Deeming

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

Maciej Los

using блок-отличная альтернатива, 5!

Priya-Kiko

Спасибо за ответ.

В моем случае у меня есть основной класс (форма), где я написал общую процедуру DrawItem, подобную этой, которая будет использоваться всеми списками ownerdrawn в других модулях моего проекта :

общественная статический недействительным lvDrawItem(объект отправителя, DrawListViewItemEventArgs е строки [ул.], типа int32[] х)
{
Font myfont = новый шрифт ("Segoe UI", 12);
for (int mi = 0; mi < str.Длина; mi++)
е.Графика.Шнурок ([Ми], сайт myfont, PopUpTextColor, ул. Новая точка(электронная.По часам.Х + х[Ми], Эл.По часам.Г));

if ((e. State & ListViewItemStates.Focused) = = ListViewItemStates.Сосредоточенный)
{
е.Графика.FillRectangle(PopUpSelectedItemBackColor, e. Bounds);
for (int mi = 0; mi < str.Длина; mi++)
е.Графика.Шнурок ([Ми], сайт myfont, PopUpSelectedItemForeColor, ул. Новая точка(электронная.По часам.Х + х[Ми], Эл.По часам.Г));
}
}

Так что в данном случае у меня есть сомнения в том, как будет утилизирован мой Фонт.

Я на самом деле застрял с выяснением решения для "ошибки создания дескриптора окна". В процессе работы я думаю, что шрифты, которые я использую в цикле для listview по всему проекту, могут съедать память.


Пожалуйста, уточните.