В процессе работы наступил на интересные грабли, причём разбираться, что это и как с ним бороться, пришлось весь день.
Итак, есть у нас код на Delphi, который вызывает код на .NET. Чтобы этот вызов
стал возможен, из .NET наружу торчит общедоступный интерфейс IDotNetWorker
(на самом деле он называется по-другому, но для примера пусть будет так). В
интерфейсе есть функция примерно такого плана:
public int CoolFunction(string arg)
{
if (arg == "")
{
return 1;
}
return 0;
}
Как показало тестирование, если в Delphi получить интерфейс и вызвать эту функцию с параметром, равным пустой строке, то она не вернёт 1, как можно было бы предположить. Вместо этого она упадёт со страшным грохотом и причину придётся искать довольно долго, особенно если происходит это в службе Windows (как в нашем случае).
Разгадка проста. Пустая строчка по какой-то неясной мне причине автоматически
преобразуется в null
. При попытке сравнить его с пустой строкой вылетает
исключение.
Судя по всему, это не новость для тех, кто пишет на .NET. В C# имеется несколько
вещей, потенциально пригодных для этого. Например, можно проверить, не является
ли строчка пустой, либо null
.
if (string.IsNullOrEmpty(arg))
{
return 1;
}
Или проверить, не является ли строчка null
и, если является, задать ей значение
по умолчанию.
string myString = arg ?? "Значение по умолчанию";
Эта конструкция представляет собой аналог тернарного оператора, специально заточенный
под проверку на null
:
string myString = (arg != null) ? arg : "Значение по умолчанию";
Вот такая интересная штука.