Какой смысл переопределения Располагают (bool располагающий) в.NET?

Вы можете использовать .split () , затем getattr () и ast.literal_eval ()

import ast

s = '[KEYTYPE.FWPROD2KEY, KEYTYPE.FWPROD2KEY, DOWNLOADMODE.FWTOFW, False, DEPLOYMODE.DEPLOY]'

def get_val(value):
    values = value.split('.')
    if values[0] in locals: return getattr(getattr(locals, value), values[1])
    if values[0] in globals: return getattr(getattr(globals, value), values[1])
    try: return ast.literal_eval(value)
    except: return value

#slice the string to get rid of the brackets
#and .replace to remove all spaces
data = [get_val(val) for val in s[1:-1].replace(' ', '').split(',')]

. безопасный способ сделать это.

41
задан John Saunders 8 February 2010 в 02:00
поделиться

7 ответов

Это не строго необходимо. Это - часть рекомендуемого Доступного шаблона. Если Вы не считали раздел Framework Design Guidelines по этому (9.3 в первом выпуске, не имейте второго выпуска удобным жаль), тогда, Вы должны. Попытка эта ссылка .

Это полезно для различения доступной очистки и finalizable garbage-collection-is-trashing-me.

Вы не должны делать этого тот путь, но необходимо читать на нем и понять, почему это рекомендуется прежде, чем обесценить его как ненужный.

31
ответ дан Hamish Smith 27 November 2019 в 00:22
поделиться

Существует немного предвзятости в документах MSFT о доступном шаблоне. Существует две причины, необходимо реализовать IDisposable:

  1. у Вас есть поля типа, который реализует IDisposable
  2. , у Вас есть финализатор.

Падеж 1 довольно общ в большей части кода. Падеж 2 довольно общ в коде, который пишет Microsoft, они были теми, которые записали управляемые оболочки вокруг неуправляемых ресурсов, те то завершение потребности. Но должно быть очень редким в Вашем коде. В конце концов, у Вас есть все те хорошие классы.NET, чтобы сделать грязную работу для Вас. Просто необходимо назвать их Располагать () методы.

Только случай 2 требует доступного шаблона. Microsoft должна использовать его много. Вам просто будет нужно простое, Располагают () большую часть времени.

14
ответ дан Hans Passant 27 November 2019 в 00:22
поделиться

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

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

при изоляции класса (и мои представления об изоляции классов по мере возможности, вероятно, известны к настоящему времени - дизайн для наследования или запрещают его ), нет никакого смысла в представлении виртуального метода.

я не могу помнить прошлый раз, когда я реализовал IDisposable "сложным" способом по сравнению с выполнением его самым очевидным способом, например,

public void Dispose()
{
    somethingElse.Dispose();
}

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

43
ответ дан Community 27 November 2019 в 00:22
поделиться

В дополнение к другим большим ответам можно хотеть проверить эти статьи:

5
ответ дан Hosam Aly 27 November 2019 в 00:22
поделиться

Дополнительный метод с расположением bool вышел из руководства по проектированию платформы где-нибудь. Это - просто шаблон, чтобы позволить Вашему классу иметь расположить метод быть в состоянии быть названным многократно, не выдавая исключение. Это не абсолютно необходимо. Технически Вы могли выполнить в нем расположить метод.

3
ответ дан Bob 27 November 2019 в 00:22
поделиться

Просто чтобы расширить то, что говорили другие: дело не только в том, что вам не нужна «сложная утилизация», но и в том, что вы на самом деле не хотите для повышения производительности причины.

Если вы пойдете по маршруту «сложное удаление» и реализуете финализатор, а затем забудете явно удалить свой объект, ваш объект (и все, что он ссылается) переживет дополнительную генерацию сборщика мусора, прежде чем он будет действительно удален (поскольку он должен еще раз подождите, пока CLR не вызовет финализатор). Это просто вызывает большую нагрузку на память, которая вам не нужна. Кроме того, вызов финализатора для целой кучи объектов имеет нетривиальную стоимость.

Так что избегайте, если у вас (или у ваших производных типов) нет неуправляемых ресурсов.

О, и пока мы находимся в этой области: методы вашего класса, которые обрабатывают события от других, должны быть «безопасными» перед лицом вызова после того, как ваш класс был удален. Проще всего просто выполнить бездействие, если класс удален. См. http://blogs.msdn.com/ericlippert/archive/2009/04/29/events-and-races.aspx

1
ответ дан 27 November 2019 в 00:22
поделиться

Первым улучшением был бы подсчет количества совпадающих пар чисел, и если, скажем, есть 5 «1» на верхней части квадратов, но только 4 на нижней, то должен быть «1», указывающий на верхнюю часть сетки.

-121--4950549-

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

public RichTextBox RichTextBox {
  get{
    //the RichTextBox would have a property x:Name="richTextbox" in the xaml
    return richTextBox;
  }
}
-121--3802282-

Одна вещь, которая дает вам возможность выполнять работу в нерабочем состоянии

Делать все с управляемым объектом, кроме «себя», в финализаторе чрезвычайно... непредсказуемо. Большая часть этого связана с тем, что ваши финализаторы будут вызываться на этапе 2 отключения вашего AppDomain недетерминированным способом - поэтому, когда ваш финализатор вызывается, крайне вероятно, что объекты, на которые у вас еще есть ссылки, уже были доработаны.

Отправка вызовов Dispose и finalizer одному и тому же методу позволяет совместно использовать код завершения работы, в то время как логический параметр позволяет пропустить управляемую очистку, если она имеется.

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

1
ответ дан 27 November 2019 в 00:22
поделиться
Другие вопросы по тегам:

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