Ketik.Tipe
Salah satu yang saya lihat menggigit banyak orang adalah Type.GetType(string). Mereka bertanya-tanya mengapa itu bekerja untuk tipe dalam perakitan mereka sendiri, dan beberapa jenis suka System.String, tetapi tidak System.Windows.Forms.Form. Jawabannya adalah bahwa ia hanya terlihat dalam perakitan saat ini dan di mscorlib.
Metode anonim
C # 2.0 memperkenalkan metode anonim, yang mengarah ke situasi buruk seperti ini:
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();
}
}
}
Apa yang akan dicetak? Yah, itu sepenuhnya tergantung pada penjadwalan. Ini akan mencetak 10 angka, tetapi mungkin tidak akan mencetak 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 yang mungkin Anda harapkan. Masalahnya adalah bahwa itu adalah ivariabel yang telah ditangkap, bukan nilainya pada saat penciptaan delegasi. Ini dapat diselesaikan dengan mudah dengan variabel lokal ekstra dari cakupan yang tepat:
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();
}
}
}
Eksekusi blok iterator yang ditangguhkan
"Unit test orang miskin" ini tidak lulus - mengapa tidak?
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
}
}
}
Jawabannya adalah bahwa kode dalam sumber CapitalLetterskode tidak dieksekusi sampai metode iterator MoveNext()pertama kali dipanggil.
Saya memiliki beberapa keanehan lain di halaman brainteasers saya .