Type.GetType
Тот, кого я видел, кусает многих людей Type.GetType(string). Они задаются вопросом, почему это работает для типов в их собственной сборке, и некоторым типам нравится System.String, но нет System.Windows.Forms.Form. Ответ в том, что он выглядит только в текущей сборке и в mscorlib.
Анонимные методы
C # 2.0 ввел анонимные методы, что привело к неприятным ситуациям, подобным этому:
using System;
using System.Threading;
class Test
{
static void Main()
{
for (int i=0; i < 10; i++)
{
ThreadStart ts = delegate { Console.WriteLine(i); };
new Thread(ts).Start();
}
}
}
Что это распечатает? Ну, это полностью зависит от планирования. Он напечатает 10 чисел, но, вероятно, не будет печатать 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, что вы можете ожидать. Проблема в том, что это iзахваченная переменная, а не ее значение в момент создания делегата. Это может быть легко решено с помощью дополнительной локальной переменной правильной области видимости:
using System;
using System.Threading;
class Test
{
static void Main()
{
for (int i=0; i < 10; i++)
{
int copy = i;
ThreadStart ts = delegate { Console.WriteLine(copy); };
new Thread(ts).Start();
}
}
}
Отложенное выполнение блоков итераторов
Этот «модульный тест бедняка» не проходит - почему бы и нет?
using System;
using System.Collections.Generic;
using System.Diagnostics;
class Test
{
static IEnumerable<char> CapitalLetters(string input)
{
if (input == null)
{
throw new ArgumentNullException(input);
}
foreach (char c in input)
{
yield return char.ToUpper(c);
}
}
static void Main()
{
// Test that null input is handled correctly
try
{
CapitalLetters(null);
Console.WriteLine("An exception should have been thrown!");
}
catch (ArgumentNullException)
{
// Expected
}
}
}
Ответ заключается в том, что код в исходном CapitalLettersкоде не выполняется до тех пор, пока метод итератора не MoveNext()будет впервые вызван.
У меня есть некоторые другие странности на моей странице мозгов .