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()
вперше не буде викликаний метод ітератора .
У мене на сторінці моїх брендівників є деякі інші дивацтва .