Type.GetType
Bir sürü insanı ısırdığımı gördüm Type.GetType(string)
. Kendi montajlarındaki türler için neden işe yaradığını merak ediyorlar System.String
, ancak bazıları gibi , ama değil System.Windows.Forms.Form
. Cevap, sadece mevcut montajda ve içeriye bakmasıdır mscorlib
.
Anonim yöntemler
C # 2.0, böyle kötü durumlara yol açan anonim yöntemler tanıttı:
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();
}
}
}
Ne yazdıracak? Tamamen programlamaya bağlıdır. 10 sayı basacaktır, ancak muhtemelen 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 yazdıramaz. Sorun, i
temsilci oluşturma noktasında değeri değil, yakalanan değişken olmasıdır. Bu, doğru kapsamın ekstra bir yerel değişkeni ile kolayca çözülebilir:
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();
}
}
}
Yineleyici blokların ertelenmiş yürütülmesi
Bu "zavallı adamın birim testi" geçmiyor - neden olmasın?
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
}
}
}
Cevap, kodun kaynağı içindeki CapitalLetters
kodun, yineleyicinin MoveNext()
yöntemi ilk çağrılana kadar yürütülmediğidir .
Benim bazı diğer tuhaflıklar var brainteasers sayfa .