Компилятор.NET — ОТЛАЖИВАЕТ по сравнению с выпуском

itertools.product, кажется, дает вам то, что вы ищете. Он часто используется вместо вложенных for циклов, но имеет удобный repeat kwarg, который облегчает вашу жизнь здесь.

l = 3  # that's a lower-case L. Never use that in code, though, it looks like a 1.

digits = itertools.product(range(3), repeat=l)

# is equivalent to

def my_product():
    """the same as above itertools.product if l==3"""
    for i in range(3):
        for j in range(3):
            for k in range(3):
                yield (i, j, k)
my_digits = my_product()  # YUCK!

Это создает генератор (примечание: не список!), Который генерирует все значения, которые вы ищете от (0, 0, 0) до (2, 2, 2). Чтобы составить список, просто приведите его к одному.

digits = list(itertools.product(range(3), repeat=l))  # still a lower-case L. Still don't do this.

Затем, чтобы сравнить цифры, просто используйте индексацию, как любой список 2D.

first_value = digits[0]
first_digit = first_value[0]
assert first_digit == digits[0][0]

second_value = digits[1]
first_digit_of_second_value = second_value[0]
assert first_digit_of_second_value == digits[1][0]

if digits[0][0] == digits[1][0]:
    # that's these two:  v          v
    # digits ==         (0, 0, 0), (0, 0, 1), (0, 0, 2), ...
    do_whatever_you_want()

Если вы хотите специально вывести (0, 0, 0) как 000, вы можете написать для этого функцию:

def sprint_tuple(tup):
    """Takes a tuple of digits and pretty Sprints them.

    >>> sprint_tuple((0, 0, 1))
    '001'
    """

    return ''.join([str(i) for i in tup])

, затем выполнить цикл по digits и напечатать каждый:

]
>>> for tup in digits:
...     print(sprint_tuple(tup))
000
001
002
010
...
222
18
задан Pete 26 August 2008 в 19:20
поделиться

7 ответов

Предпочтительный метод состоит в том, чтобы на самом деле использовать условный атрибут для обертывания вызовов отладки, не используют директивы компилятора. #ifs может стать хитрым и может привести к странным проблемам сборки.

пример использования условного атрибута следующим образом (в C#, но работает в VB.NET также):

[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
  // do stuff
}

, Когда Вы компилируете без набора флага DEBUG, любой вызов к WriteDebug будет удален, как был принят, происходил с Отладкой. Запишите ().

21
ответ дан 30 November 2019 в 08:38
поделиться

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

public void Debug(string s)
{
#if DEBUG
    System.Diagnostics.Debug(...);
#endif
}
предварительного компилятора
1
ответ дан 30 November 2019 в 08:38
поделиться

Исследуйте эти Отладка. Запишите метод. Это отмечено с

[Conditional("DEBUG")]

атрибут.

справка MSDN для состояния ConditionalAttribute:

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

, Имеет ли конфигурация сборки маркировку выпуска или отладки, не имеет значения, что имеет значение, определяется ли Отладочный символ в нем.

5
ответ дан 30 November 2019 в 08:38
поделиться

Используя ОТЛАДКУ будет символ компилятора, как Вы сказал, на самом деле опустите код от блока.

я верю той Системе. Диагностика. Отладка. Запись будет всегда производить к приложенному отладчику, даже если Вы создали в режиме Release. На статья MSDN:

информация о Записях об отладке к приемникам трассировки в наборе Слушателей.

, Если Вы не хотите никакой , производят, необходимо будет перенести вызов для Отладки. Запишите с ОТЛАДКОЙ, постоянной как Juan, сказал:

#if DEBUG
    System.Diagnostics.Debug.Write(...);
#endif
1
ответ дан 30 November 2019 в 08:38
поделиться

Я прочитал статью также, и она привела меня полагать что, когда ОТЛАДКА не была определена, что ConditionalAttribute объявил в Системе. Функции отладки заставили бы компилятор не учитывать этот код полностью. Я предполагаю, что то же самое верно для ТРАССИРОВКИ. Таким образом, Система. Диагностика. Функции отладки должны иметь ConditionalAttributes для ОТЛАДКИ и для ТРАССИРОВКИ. Я был неправ в том предположении. Отдельный класс Трассировки имеет те же функции, и они определяют ConditionalAttribute, зависящий от постоянной ТРАССИРОВКИ.

От Системы. Диагностика. Отладка: _ Общедоступная Общая Запись Sub (_ обмениваются сообщениями Как Строка _)

От Системы. Диагностика. Трассировка: _ Общедоступный Общий Sub WriteLine (_ обмениваются сообщениями Как Строка _)

кажется затем, что мое исходное предположение было корректно, что Система. Диагностика. Отладка (или система. Диагностика. Трассировка) операторы на самом деле не включены в компиляцию, как будто они были включены в ОТЛАДКУ #IF (или ТРАССИРОВКА #IF) регионы.

, Но я также изучил здесь от Вас парней и проверил, что СБОРКА КОНЕЧНЫХ ВЕРСИЙ сам по себе не заботится об этом. По крайней мере, с проектами Silverlight, которые все еще немного облуплены, необходимо войти в "Усовершенствованные Опции Компиляции..." и удостовериться, что ОТЛАДКА не определяется.

Мы спрыгнули с.NET 1.1/VS2003 к.NET 3.5/VS2008, таким образом, я думаю, что часть этого раньше работала по-другому, но возможно она изменилась в 2.0/VS2005.

1
ответ дан 30 November 2019 в 08:38
поделиться

По моему опыту, выбор между Отладкой и Выпуском в VB.NET не имеет никакого значения. Можно добавить пользовательские действия к обеим конфигурациям, но по умолчанию я думаю, что они - то же.

Используя Выпуск, конечно, не удалит Систему. Диагностика. Отладка. Запишите операторы.

-6
ответ дан 30 November 2019 в 08:38
поделиться

Чтобы выбрать, хотите ли вы, чтобы отладочная информация была скомпилирована или удалена,

войдите на вкладку «Сборка» в окне свойств проекта.

Выберите правильную конфигурацию (Активный / Выпуск / Отладка / Все) и убедитесь, что вы отметили "Константу отладки", если вам нужна информация, или снимите отметку, если не хотите. .

Применить изменения и перестроить

1
ответ дан 30 November 2019 в 08:38
поделиться
Другие вопросы по тегам:

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