Итак, я обсуждал с коллегой преимущества ReSharper (в настоящее время v8.1) с точки зрения рефакторинга if/else, если инструкции для переключения операторов. Я не думал об этом, но мой коллега придумал пример ниже. Дело в том, что, когда код запускается, вы можете видеть, что он фактически переходит к «else» в DoElseIf, но не в DoSwitch. Несмотря на это, ReSharper предполагает, что я реорганизую my if/else, если оператор switch, когда очевидно, что скомпилированный код не ведет себя одинаково.ReSharper: if/else if vs switch in C#
Может ли кто-нибудь, у кого больше знания ReSharper, чем я, скажите мне, если я смотрю на это неправильно или если я должен быть осторожным рефакторинг if/else, если оператор switch?
Вот код:
namespace ConsoleApplication1
{
class Program
{
static bool MyValue { get; set; }
static void Main(string[] args)
{
Task t = new Task(ChangeIt);
t.Start();
for (var i = 0; i < 1000000; i++)
{
DoElseIf();
}
for (var i = 0; i < 1000000; i++)
{
DoSwitch();
}
Console.WriteLine("Work's done!");
Console.ReadLine();
}
static void DoSwitch()
{
switch (MyValue)
{
case true:
//Console.WriteLine("true");
break;
case false:
//Console.WriteLine("false");
break;
default:
Console.WriteLine("WTF (Switch)!");
break;
}
}
static void DoElseIf()
{
if (MyValue == true)
{
//Console.WriteLine("true");
}
else if (MyValue == false)
{
//Console.WriteLine("false");
}
else
{
Console.WriteLine("WTF (Else-if)!");
}
}
public static void ChangeIt()
{
MyValue = !MyValue;
Task.Factory.StartNew(ChangeIt);
}
}
}
Заранее спасибо и счастливых праздников всем :-)
Здесь вам не нужно вводить здесь нить, просто заставьте свойство вернуть обратное значение очень простое время его чтения. –
Поскольку вы используете задачу для изменения значения, вызовите 'DoElseIf();' в обоих циклах, а результаты для обоих не будут одинаковыми. Проблема заключается в том, что вы используете общую переменную MyValue, доступную двумя потоками. –