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 i
został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 CapitalLetters
kodu nie zostanie wykonany, dopóki nie MoveNext()
zostanie wywołana metoda iteratora .
Na mojej łamigłówce są jeszcze inne dziwactwa .