Эта тема очень помогла. Мне нравится решение Райана Эмерла лучше всего для его ясности. Вот моя версия, которая, я думаю, проясняет структуру как день:
public static class Number
{
static string[] first =
{
"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine",
"Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen",
"Seventeen", "Eighteen", "Nineteen"
};
static string[] tens =
{
"Twenty", "Thirty", "Fourty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety",
};
/// <summary>
/// Converts the given number to an english sentence.
/// </summary>
/// <param name="n">The number to convert.</param>
/// <returns>The string representation of the number.</returns>
public static string ToSentence(int n)
{
return n == 0 ? first[n] : Step(n);
}
// traverse the number recursively
public static string Step(int n)
{
return n < 0 ? "Minus " + Step(-n):
n == 0 ? "":
n <= 19 ? first[n]:
n <= 99 ? tens[n / 10 - 2] + " " + Step(n % 10):
n <= 199 ? "One Hundred " + Step(n % 100):
n <= 999 ? Step(n / 100) + "Hundred " + Step(n % 100):
n <= 1999 ? "One Thousand " + Step(n % 1000):
n <= 999999 ? Step(n / 1000) + "Thousand " + Step(n % 1000):
n <= 1999999 ? "One Million " + Step(n % 1000000):
n <= 999999999 ? Step(n / 1000000) + "Million " + Step(n % 1000000):
n <= 1999999999 ? "One Billion " + Step(n % 1000000000):
Step(n / 1000000000) + "Billion " + Step(n % 1000000000);
}
}
Похоже, сборка DEBUG, которая оставляет дополнительный IL, чтобы помочь отладчику. Попробуйте еще раз в RELEASE, и он должен выглядеть чище, с оптимизацией и т. Д.
.method private hidebysig static class program/Foo Method() cil managed
{
.maxstack 8
L_0000: ldc.i4.0
L_0001: newarr object
L_0006: call object program::Resolve(object[])
L_000b: castclass program/Foo
L_0010: ret
}
Это отладочная сборка? Возможно, это сделано ради отладчика.
Я видел подобные вещи в других местах - хотя это почти всегда безвредно. Не забывайте, что большая часть оптимизации выполняется JIT, который может достаточно легко заметить подобные вещи. Единственным недостатком является то, что больше IL намекает JIT на то, что метод не должен быть встроен.