Visual Studio: информируйте отладчик о том, что функция не вызывает «побочных эффектов» - PullRequest
16 голосов
/ 26 июня 2009

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

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

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

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

Ответы [ 3 ]

20 голосов
/ 09 сентября 2010

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

x.ToString(),ac

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

3 голосов
/ 26 июня 2009

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

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

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

EDIT

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

0 голосов
/ 26 июня 2009

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

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

но эта функция не:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...