я это следующим кодуПочему компилятор меняется, если условие тройного оператора
public static void Method()
{
AutoResetEvent autoReset = new AutoResetEvent(false);
bool canceled = false;
new Thread(() =>
{
Thread.Sleep(1000);
canceled = true;
autoReset.Set();
}).Start();
do
{
Console.WriteLine("Doing something");
} while (autoReset.WaitOne() && !canceled);
Console.WriteLine("Completed");
}
И я пытаюсь achived покрытия коды 100%. Так что я только что сделал простой тест (что тест ничего, но это не точка), пробежал его и анализировал покрытие кода:
[TestMethod]
public void TestMethod1()
{
Program.Method();
}
Покрытие код дал мне, что была выполнена только часть while
линии :
После некоторых исследований я попытался декомпилировать код и выяснил, что компилятор меняется мой do while
к:
do
{
Console.WriteLine("Doing something");
flag = (!autoResetEvent.WaitOne() ? false : !flag1);
}
while (flag);
Так что false
в условном операторе никогда не тестировался (и невозможно проверить because WaitOne
never returns false
. Простым решением является простое удаление WaitOne
состояния while
и внутри do
. Так что я задаю следующие вопросы:
- Почему компилятор меняет условия на условный оператор?
- Есть ли способ предотвратить выполнение компилятором, сохраняя условие, подобное тому, которое находится во времени и не влияет на то, как скомпилировать остальную часть кода? В действительности условие в то время более сложное, чем это. Было бы проще и понятнее просто сохранить это так.
Почему вы думаете, что это результат компилятора, а не декомпилятора? – Dmitry
Хороший вопрос. Я предположил, что это был результат компилятора, потому что он был последовательным, почему я не был охвачен до 100%. Является ли публикация IL доказательством того, что это результат компилятора? –
Покрытие кода - действительно опасная метрика. 100% -ый охват ничего не говорит о качестве вашего кода или тестовых случаях - вы все равно можете пропустить критические тестовые примеры и ошибки даже при 100% -ном охвате кода. Не стреляйте за 100% покрытие, просто чтобы получить его. –