我想知道,在实例上使用假设IsNullOrEmpty()
方法List
(不在 .NET Framework 中),如果实例有效地为null,它将抛出未设置为对象异常实例的 Object 引用,或类似的东西。考虑到这一点,是否可以在空实例上调用方法?
7 回答
没有一个IsNullOrEmpty()
for a List
only String
。在后者的情况下,它是一个静态方法,所以不需要实例,你传入一个字符串引用来检查,它可以在那里检查 null。
扩展方法可以采用空的“this”参数。我不知道框架中列表的任何方法 IsNullOrEmpty,但想象一下它会被实现为:
public bool IsNullOrEmpty<T>(this IList<T> list)
{
if (list == null) return true;
return list.Count == 0;
}
您可以毫无问题地在空引用上调用此(或任何其他)扩展方法:
List<int> nullList = null;
if (nullList.IsNullOrEmpty())
{
...
}
AFAIKIsNullOrEmpty
只是类的一种方法,System.String
不适用于List
. 它是静态方法,而不是扩展方法。你这样称呼:
string.IsNullOrEmpty(text);
而不是这样
text.IsNullOrEmpty();
因此,检查引用是否未设置为对象的实例没有问题。
它是一种静态方法,将相关字符串的实例作为参数。
public static bool IsNullOrEmpty(
string value
)
http://msdn.microsoft.com/en-us/library/system.string.isnullorempty%28v=vs.110%29.aspx
IsNullOrEmpty
BLC中没有为List
您可以轻松创建扩展方法:
namespace System
{
public static class StringExtensions
{
public static bool IsNullOrEmpty(this string s)
{
return string.IsNullOrEmpty(s);
}
}
}
正如已经指出的那样,列表没有这种方法。很容易编写扩展方法,但是:
public static bool IsNullOrEmpty<T>(this IList<T> list)
{
return (list == null || list.Count == 0);
}
如果要为空值抛出异常:
public static bool IsEmpty<T>(this IList<T> list)
{
if (list == null)
throw new ArgumentNullException("list");
return (list.Count == 0);
}
CLR中没有List<T>.IsNullOrEmpty()
。
但是,也许有人为 List 写了一个扩展方法。它看起来像这样:
public static class ListExt
{
public static bool IsNullOrEmpty<T>(this List<T> self)
{
return (self == null) || (self.Count == 0);
}
}
如果是这样,您可以从实现中看到您可以安全地传递null
参数self
。这段代码会发生这种情况:
List<int> lint = null;
if (lint.IsNullOrEmpty())
{
// ...
这会调用传递lint
给它的扩展方法;在这种情况下,它通过null
并且(self == null)
实现中的检查将导致false
返回,并防止任何NullReferenceException
被抛出。
IsNullOrEmpty()
不支持aList
它只适用于String 。以下是IsNullOrEmpty
来自msdn的implimentaion。
result = s == null || s == String.Empty;
如果您想检查列表,您可以编写自己的扩展方法来执行以下操作。
public static bool IsNullOrEmpty<T>(this ICollection<T> collection)
{
if (collection == null)
return true;
return collection.Count == 0;
}