如何检查字节数组是否为空?

51

我正在下载 GetSourceAttachment 方法的 Word 文件。当该方法返回空字节时,我的字节 Attachment 数组会出现错误:

对象引用未设置为对象的实例。

当我在 if 条件中检查 Attachment 的长度时,它会输出此错误。

是否有人可以帮我默认初始化字节数组,然后检查其长度?

try
{
        byte[] Attachment = null ;

        string Extension = string.Empty;
        ClsPortalManager objPortalManager = new ClsPortalManager();
        Attachment = objPortalManager.GetSourceAttachment(Convert.ToInt32(hdnSourceId.Value), out Extension);
        if (Attachment.Length > 0 && Attachment != null)
        {
            DownloadAttachment("Attacment", Attachment, Extension);
        }
        else
        {
            ClientScript.RegisterStartupScript(typeof(Page), "SymbolError", "<script type='text/javascript'>alert('Attachment is not Uploaded !');</script>");
        }            
}
catch
{

}
7个回答

98

只需要去做。

if (Attachment != null  && Attachment.Length > 0)

来自&& 运算符

条件与(&&)运算符对其bool操作数执行逻辑与,但仅在必要时评估其第二个操作数。


26

您必须交换测试的顺序:

来自:

if (Attachment.Length > 0 && Attachment != null)

致:

if (Attachment != null && Attachment.Length > 0 )

第一个版本尝试先对Attachment进行取消引用,因此如果它为null,则会抛出异常。第二个版本将首先检查是否为null,只有在不为null时才继续检查长度(由于“布尔短路”)。


[编辑] 我来自未来告诉你,使用较新版本的C#,您可以使用"空值条件运算符"来简化上面的代码:

if (Attachment?.Length > 0)
        

21

.Net V 4.6或C# 6.0

试一试

 if (Attachment?.Length > 0)

1
也许在5年后我们的系统会认识它...但在我的4.6框架项目中,它仍然编译为错误。 - HellBaby
2
@HellBaby,那么您需要检查与项目相关联的语言。仅仅因为您使用了DotNet 4.6并不意味着您正在使用C# >= 6。您可能仍在使用C#5,这一点您并不知道。进入您的项目设置:右键单击项目->属性->生成->高级,并将语言明确设置为C# >= 6。 - René Kåbis

10

您的支票应该是:

if (Attachment != null  && Attachment.Length > 0)

首先检查附件是否为null,然后检查长度,因为你使用了&&,这会导致短路求值

&&运算符(C#参考)

条件与(&&)对其bool操作数执行逻辑与,但只在必要时评估其第二个操作数

以前的条件如下:(Attachment.Length > 0 && Attachment != null),由于第一个条件正在访问属性Length,如果Attachment为null,则会出现异常。使用修改后的条件(Attachment != null && Attachment.Length > 0),它将首先检查是否为null,仅在Attachment不为null时才继续执行。


谢谢 谢谢 谢谢 Habib...非常感谢。但是你能告诉我之前的问题在哪里吗? - SANDEEP
@SANDEEP,我刚刚修改了答案,解释了为什么你之前会出现异常。 - Habib

3

我认为最好的if语句是这个:

if(Attachment  is { Length: > 0 })

这段代码检查附件是否为null以及其长度


0

现在我们也可以使用:

if (Attachment != null  && Attachment.Any())

对于开发人员来说,Any()通常比检查Length() > 0更容易一眼理解。而且在处理速度方面几乎没有什么区别。


是的,但.Any()方法不是内部方法,并且会添加对System.Linq(LINQ)库的依赖。LINQ确实很棒,但对于这个简单的操作,我不会添加额外的依赖。 - Tolbxela

0
在Android Studio版本3.4.1
if(Attachment != null)
{
   code here ...
}

问题是关于C#的。请看底部的标签...;-) - Tolbxela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接