Подтвердить что ты не робот

Visual Studio: сделайте отладчик осведомленным о том, что функция не вызывает "побочные эффекты",

У меня есть объект, который я должен наблюдать за выходом функции довольно много раз через окно просмотра. Проблема в том, что я должен нажимать кнопку обновления каждый раз, когда я нахожу шаг, потому что "это выражение вызывает побочные эффекты и не будет оцениваться". Есть ли способ пометить функцию чем-то вроде [DoNotCauseSideEffects], чтобы часы автоматически могли ее оценивать каждый раз, когда я делаю шаг?

Я кодирую С# в VS2008 или 2010.

Edit: Функция выглядит так и делает, как вы можете видеть, не вызывать никаких побочных эффектов. (X, y, z все удваиваются)

public override string ToString()
{
    return "{ " + x.ToString(".00") + ", " + y.ToString(".00") + ", " + z.ToString(".00") + "}";
}
4b9b3361

Ответ 1

Вы можете добавить ,ac в выражение watch, чтобы оно автоматически обновляло значение:

x.ToString(),ac

См. MSDN для получения дополнительной информации и других спецификаторы формата.

Ответ 2

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

Оба С# и VB.Net имеют разные EE, и у каждого из них есть собственное определение того, не влияет ли функция на побочные эффекты. В общем, хотя они оба рассматривают явный вызов функции, чтобы иметь побочные эффекты, и не будут обрабатывать их в ситуациях, таких как степпинг, где отладчик хочет отключить побочные эффекты.

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

ИЗМЕНИТЬ

Хотелось прояснить некоторые заблуждения. Ни отладчик, ни оценщик выражений не проведут проверку методов, чтобы определить, имеет ли функция побочные эффекты. Они просто отмечают наличие функции и отмечают ее как потенциально имеющие побочные эффекты. Они не пытаются каким-либо образом проверить код метода.

Ответ 3

Вы пытались сделать так, чтобы функция не изменяла свойства класса или глобальные переменные? Мое определение "побочных эффектов" - это "изменения среды выполнения, которые выполняются во время выполнения функции". Таким образом, эта функция вызывает побочные эффекты:

void addValues(int operand1, int operand2) {
  globalSum = operand1 + operand2;
}

но эта функция не выполняет:

int addValues(int operand1, int operand2) {
  return operand1 + operand2;
}

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