Ну что, продолжаем?
Итак, дано: .Net 4+ / mono / .Net Core и
| вот такой вот код: |
| using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace ConsoleApplication1
{
class Program
{
private const bool FalseConst = false;
private static readonly bool falseRO = false;
private static bool falseSettable = false;
[MethodImpl(MethodImplOptions.NoInlining)]
private static string CaseA()
{
//Debugger.Break();
return "A: " + (FalseConst ? "Set" : "Not set");
}
[MethodImpl(MethodImplOptions.NoInlining)]
private static string CaseB()
{
//Debugger.Break();
return "B: " + (falseRO ? "Set" : "Not set");
}
[MethodImpl(MethodImplOptions.NoInlining)]
private static string CaseC()
{
//Debugger.Break();
return "C: " + (falseSettable ? "Set" : "Not set");
}
static void Main(string[] args)
{
Console.WriteLine(CaseA());
Console.WriteLine(CaseB());
Console.WriteLine(CaseC());
Setup();
WriteCases();
Console.WriteLine(CaseA());
Console.WriteLine(CaseB());
Console.WriteLine(CaseC());
Console.WriteLine("Done");
Console.ReadKey();
}
private static void Setup()
{
var bf = BindingFlags.Static | BindingFlags.NonPublic;
var roField = typeof(Program).GetField(nameof(falseRO), bf);
roField.SetValue(null, true);
falseSettable = true;
}
private static void WriteCases()
{
Console.WriteLine();
Console.WriteLine("A/B/C set? {0}, {1}, {2}", FalseConst, falseRO, falseSettable);
Console.WriteLine();
}
}
}
|
| |
Вопрос 1, простой: объяснить вывод для CaseB.
| Скрытый текст |
| A: Not set
B: Not set
C: Not set
A/B/C set? False, True, True
A: Not set
B: Not set
C: Set
Done
|
| |
Вопрос 2, посложнее: где эта багофича выстреливает (в смысле, оказывается полезной)?