在C#中,如何在可能为空的实例上调用方法?

在C#中,如何在可能为空的实例上调用方法?,c#,C#,我想知道,在列表实例(不在.NET Framework中)上使用假设的IsNullOrEmpty()方法,如果实例实际上为null,它将抛出一个未设置为对象异常实例的对象引用,或者类似的情况。考虑到这一点,是否可以对空实例调用方法?它是一种静态方法,将所讨论字符串的实例作为参数 public static bool IsNullOrEmpty( string value ) 在为列表定义的BLC中没有IsNullOrEmpty方法 您可以轻松创建扩展方法: namespace Sys

我想知道,在
列表
实例(不在.NET Framework中)上使用假设的
IsNullOrEmpty()
方法,如果实例实际上为null,它将抛出一个未设置为对象异常实例的对象引用,或者类似的情况。考虑到这一点,是否可以对空实例调用方法?

它是一种静态方法,将所讨论字符串的实例作为参数

public static bool IsNullOrEmpty(
    string value
)

在为
列表定义的BLC中没有
IsNullOrEmpty
方法

您可以轻松创建扩展方法:

namespace System
{
    public static class StringExtensions
    {
        public static bool IsNullOrEmpty(this string s)
        {
            return string.IsNullOrEmpty(s);
        }
    }
}

对于
列表
字符串
,没有
IsNullOrEmpty()。在latters的情况下,它是一个静态方法,因此不需要实例,您传入一个字符串引用进行检查,它可以在那里检查null。

AFAIK
IsNullOrEmpty
只是类
System.string
的一个方法,不可用于
List
。它是一种静态方法,而不是扩展方法。你这样称呼:

string.IsNullOrEmpty(text);
public static class ListExt
{
    public static bool IsNullOrEmpty<T>(this List<T> self)
    {
        return (self == null) || (self.Count == 0);
    }
}
而不是像这样

text.IsNullOrEmpty();

因此,检查引用是否未设置为对象的实例没有问题。

扩展方法可以采用null“this”参数。我不知道框架中有哪种方法对于列表是空的,但想象一下它的实现方式如下:

public bool IsNullOrEmpty<T>(this IList<T> list)
{
    if (list == null) return true;
    return list.Count == 0;
}
public bool为空(此IList列表)
{
if(list==null)返回true;
返回列表。计数==0;
}
您可以在空引用上调用此(或任何其他)扩展方法,而不会出现任何问题:

List<int> nullList = null;
if (nullList.IsNullOrEmpty())
{
    ...
}
List nullList=null;
if(nullList.IsNullOrEmpty())
{
...
}

正如已经指出的,列表没有这种方法。但是,编写扩展方法非常简单:

public static bool IsNullOrEmpty<T>(this IList<T> list)
{
     return (list == null || list.Count == 0);
}
publicstaticbool为空(此IList列表)
{
返回(list==null | | list.Count==0);
}
如果要为null引发异常:

public static bool IsEmpty<T>(this IList<T> list)
{
    if (list == null)
        throw new ArgumentNullException("list");

    return (list.Count == 0);
}
公共静态bool为空(此IList列表)
{
if(list==null)
抛出新的ArgumentNullException(“列表”);
返回(list.Count==0);
}
CLR中没有
列表。IsNullOrEmpty()

然而,也许有人为List编写了一个扩展方法。它看起来像这样:

string.IsNullOrEmpty(text);
public static class ListExt
{
    public static bool IsNullOrEmpty<T>(this List<T> self)
    {
        return (self == null) || (self.Count == 0);
    }
}
这将调用将
lint
传递给它的扩展方法;在这种情况下,它将通过
null
,实现中的
(self==null)
检查将导致返回
false
,并将防止抛出任何
null引用异常
不支持
列表
它只支持字符串。以下是msdn中
IsNullOrEmpty
的实现

result = s == null || s == String.Empty;
如果您想检查列表,您可以编写自己的扩展方法,如下所示

  public static bool IsNullOrEmpty<T>(this ICollection<T> collection)
    {
        if (collection == null)
            return true;

        return collection.Count == 0;
    }
公共静态bool为空(此ICollection集合)
{
if(集合==null)
返回true;
返回集合。计数==0;
}

IsNullOrEmpty()方法在
列表上执行
实例!恐怕没有这样的方法你在哪里看到的?可能在
List
上有第三方扩展方法?我没有提到
IsNullOrEmpty()
List
的.NET Framework扩展。这确实是一种第三方扩展方法。什么是第三方库?如果您将其名称添加到问题中,您可能会得到更相关的答案:)这不是扩展方法。非常确定它实际上不是扩展方法。这不是扩展方法。扩展方法必须是静态类的一部分,并且第一个参数必须以this开头抱歉,是的,它只是
string
+1上的
static
方法,我的朋友,你真的回答了下面的问题。@AntP,没问题;现在你已经删除了你的评论,我将删除我的评论。但是,FWIW,这句话
FWIW,当我第一次发布时,似乎有些ajax调用搞乱了友好的时间字符串,因为它告诉我我领先了20秒。
仍然不符合本论坛的精神。当你来到这里只是为了帮助人们,你做了更多的好事,获得了更多的声誉,因为你有正确的动机。