Я думаю, вы не можете без родного кода и JNI. Взгляните на библиотеку Java Curses: http://sourceforge.net/projects/javacurses/
Компилируется в
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;
}
Передача 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
.
Потому что это будет раздражать. Для большинства компаний нет семантической разницы между пустой и пустой строкой.
Потому что они реализовали String.IsNullOrEmpty и оставили нам решать, как его использовать.
Если у вас есть проблема, которая может возникнуть в реальном приложении, вы всегда можете проверить значение null перед отображением текста. Затем вы можете отобразить альтернативный текст или ничего.