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 : "Значение по умолчанию";

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

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

Reply

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

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