Почему нет исключения при добавлении нуля в строку?

Я думаю, вы не можете без родного кода и JNI. Взгляните на библиотеку Java Curses: http://sourceforge.net/projects/javacurses/

10
задан Anthony Pegram 22 July 2010 в 19:19
поделиться

5 ответов

Компилируется в

Console.WriteLine(String.Concat("Hello World ", obj));

. Метод String.Concat игнорирует нулевые параметры.

Он определяется следующим образом: (Из справочного источника .Net)

    public static String Concat(Object arg0, Object arg1) {
        if (arg0==null) {
            arg0 = String.Empty; 
        }

        if (arg1==null) { 
            arg1 = String.Empty;
        } 
        return Concat(arg0.ToString(), arg1.ToString());
    }

Я не знаю, почему он просто не возвращает arg1.ToString () if arg0 == null .

Метод String.Concat (string, string) определяется следующим образом:

    public static String Concat(String str0, String str1) { 
        if (IsNullOrEmpty(str0)) { 
            if (IsNullOrEmpty(str1)) {
                return String.Empty; 
            }
            return str1;
        }

        if (IsNullOrEmpty(str1)) {
            return str0; 
        } 

        int str0Length = str0.Length; 

        String result = FastAllocateString(str0Length + str1.Length);

        FillStringChecked(result, 0,        str0); 
        FillStringChecked(result, str0Length, str1);

        return result; 
    }
21
ответ дан 3 December 2019 в 16:28
поделиться

Передача null параметра в метод не обязательно вызовет исключение; это зависит от реализации метода (и в этом случае вы, вероятно, увидите ArgumentNullException).

Попытка доступа к члену* объекта null - это то, что всегда будет вызывать NullReferenceException, гарантированно***.

Итак...

Может вызвать или не вызвать исключение

object obj = null;
SomeMethod(obj); // passing as parameter

Вызовет определенно исключение

object obj = null;
int hashCode = obj.GetHashCode(); // calling instance method

В случае рассматриваемого кода параметр, который вы передаете в Console. WriteLine на самом деле является результатом скомпилированного вызова string.Concat, который позволяет передавать null значения в качестве параметров и по сути игнорирует их - как уже отметил SLaks.


* Методы расширения - совсем другое дело; их можно вызывать с "нулевыми" параметрами; но поскольку они лишь создают иллюзию того, что действуют как методы экземпляра, это правило к ним не применяется. Фактически, методы расширения - это статические методы. Если вы вызываете один из них "на" null значении, вы фактически передаете null в качестве параметра.

**Здесь я не включаю Nullable значения с HasValue == false; хотя во многих случаях их удобно рассматривать как null, это просто для синтаксического удобства: они не более null, чем любой другой тип значения может быть null.

*** Здесь я говорю о C#. Как указывает SLaks в комментарии, это не является правилом самого CLI. Но все вызовы методов экземпляра в C# компилируются в callvirt инструкции в IL, которые будут бросать исключение, если экземпляр null.

3
ответ дан 3 December 2019 в 16:28
поделиться

Потому что это будет раздражать. Для большинства компаний нет семантической разницы между пустой и пустой строкой.

1
ответ дан 3 December 2019 в 16:28
поделиться

Потому что они реализовали String.IsNullOrEmpty и оставили нам решать, как его использовать.

0
ответ дан 3 December 2019 в 16:28
поделиться

Если у вас есть проблема, которая может возникнуть в реальном приложении, вы всегда можете проверить значение null перед отображением текста. Затем вы можете отобразить альтернативный текст или ничего.

0
ответ дан 3 December 2019 в 16:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: