morthan2006: (Default)

В процессе работы наступил на интересные грабли, причём разбираться, что это и как с ним бороться, пришлось весь день.

Итак, есть у нас код на 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 : "Значение по умолчанию";

Вот такая интересная штука.

Mood:: подозрительное
Music:: Royal Hunt - Stranded

June

SunMonTueWedThuFriSat
1
 
2
 
3 4
 
5
 
6
 
7
 
8
 
9
 
10
 
11
 
12
 
13
 
14
 
15 16
 
17
 
18
 
19
 
20
 
21
 
22
 
23
 
24
 
25
 
26
 
27
 
28
 
29
 
30