Type.GetType
Ten, który widziałem, gryzie wiele osób Type.GetType(string). Zastanawiają się, dlaczego to działa dla typów w ich własnym zestawie, a niektóre typy lubią System.String, ale nie System.Windows.Forms.Form. Odpowiedź jest taka, że wygląda tylko w bieżącym zestawie i w mscorlib.
Anonimowe metody
C # 2.0 wprowadził anonimowe metody, prowadząc do takich nieprzyjemnych sytuacji:
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();
}
}
}
Co to wydrukuje? Cóż, to całkowicie zależy od harmonogramu. Wydrukuje 10 liczb, ale prawdopodobnie nie wydrukuje 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, czego można się spodziewać. Problem polega na tym, że izostała przechwycona zmienna, a nie jej wartość w momencie tworzenia delegata. Można to łatwo rozwiązać za pomocą dodatkowej zmiennej lokalnej o odpowiednim zakresie:
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();
}
}
}
Odroczone wykonanie bloków iteratora
Ten „test jednostkowy biednego człowieka” nie przechodzi - dlaczego nie?
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
}
}
}
Odpowiedź jest taka, że kod w źródle CapitalLetterskodu nie zostanie wykonany, dopóki nie MoveNext()zostanie wywołana metoda iteratora .
Na mojej łamigłówce są jeszcze inne dziwactwa .