2009-12-30 2 views
6

Можно создать дубликат:
string.IsNullOrEmpty() vs string.NotNullOrEmpty()Почему String.IsNullOrEmpty (str), а не str.IsNullOrEmpty()?

Может кто-нибудь объяснить мне, почему в .NET Я хотел бы написать String.IsNullOrEmpty(str) вместо str.IsNullOrEmpty()? Должна быть логическая причина, но я этого не знаю.

Это звучит, как вы, ребята, говорите

  1. Вы не можете вызывать методы из объектов, которые являются нулем в C# /. NET (я делаю это в C++, это как раз не доступ к любому члену варов)
  2. методы расширения не существует в .NET 2.0
  3. Microsoft не удосужился обновить стандарты и, вероятно, чувствовал, что это было незначительным
+3

Fun Sidenote: вы можете сделать это в Smalltalk, потому что ноль также объект (это одиночный экземпляр UndefinedObject). –

+0

Использование метода расширения для этой цели просто неверно, поскольку оно использует детали реализации методов расширения. Вы бы действительно разрешили 'null.IsNullOrEmpty()' быть юридическим утверждением, хотя он не был скомпилирован таким образом. –

+0

Точный дубликат: http://stackoverflow.com/questions/734372 –

ответ

25

Если IsNullOrEmpty был методом экземпляра, вызов его в нулевом экземпляре вызовет исключение NullReferenceException, а не возвращает false, как вам нужно.

Это может быть метод расширения, но тогда он потенциально будет запутанным - он будет выглядеть как метод экземпляра, но не будет действовать как один.

+8

Это не может быть метод расширения; он существовал до C# 3.0. – jason

+1

@ Джейсон, я думаю, что он говорит, что вы можете сделать метод расширения, чтобы справиться с этим. – kemiller2002

+3

Кроме того, вы не хотите, чтобы 'IsNullOrEmpty' возвращал' true' при получении экземпляра 'null'' string'? – jason

9

Если строка нулевая, то он не будет иметь какие-либо методов, доступные, потому что нет экземпляр объекта. Вы получите исключение для ссылки на null, чтобы попытаться вызвать метод на нулевом объекте.

String.IsNullOrEmpty является статическим, поэтому он всегда будет доступен для тестирования строковых объектов.

Я думаю, вы могли бы утверждать, что было бы удобно иметь str.IsEmpty (как сказал Джонатан, вы можете сделать extenion method для строкового объекта, чтобы справиться с этим), но на самом деле так же просто вызвать String.IsNullOrEmpty (str) и охватывает обе ситуации. Несмотря на то, что они не совпадают, большинство людей приравнивают их к такому (с точки зрения бизнес-логики и проверке значения для строки, которую я имею в виду) при обработке значений строк.

4

IsNullOrEmpty - статический метод на классе string; это не метод экземпляра. Это связано с тем, что если str имеет значение null, нет смысла ссылаться на метод экземпляра, поскольку вы получите NullReferenceException. Таким образом, IsNullOrEmpty должен быть статическим методом.

5

String.IsNullOrEmpty - метод класса.

Если str был Nothing (Null), то вы не могли называть его методом. Вы можете вызвать метод экземпляра только для объекта.

+0

Это помогает упомянуть, что это статический метод класса экземпляра, а не только метод класса. Если это был метод класса, то то, что он написал, было бы истинным, т. Е.: String someobject; someobject.isnullorempty(); – JonH

0

В некоторых случаях было бы хорошо, если бы можно было определить поведение по умолчанию для статически типизированных нулевых ссылок. Используя методы расширения, во многих случаях это можно эффективно достичь. Однако есть некоторые ошибки. Например, приведение объекта к несвязанному типу обычно запрещается на языках .net, так как нет случаев, когда такое поведение было бы законным во время выполнения. С другой стороны, если объект был нулевым, его можно было бы передать объекту, а затем нулевой объект мог быть перенесен на другой тип. Если результат такого приведения можно рассматривать как экземпляр по умолчанию последнего типа, эффект будет заключаться в том, чтобы сделать литой полу-законным.

3

Я использовал метод расширения некоторое время. Прекрасно работает.

public static bool IsNullOrEmpty(this string val) 
{ 
    return string.IsNullOrEmpty(val); 
} 

Это, очевидно, делает то же самое, как string.IsNullOrEmpty (строка), но это просто легче сделать что-то вроде

if(mystring.IsNullOrEmpty()) 
{ 
    //... do something 
} 
Смежные вопросы