空对象检测

Null object detection

提问人:TamaraL96 提问时间:8/3/2018 最后编辑:johnny 5TamaraL96 更新时间:8/3/2018 访问量:303

问:

在我的拖放列表视图中,我通过以下方式收集拖放文件:

var objects=Data.GetData(DataFormats.FileDrop, false);

我也可以投射这个,我得到所有拖放文件的路径:

string[] DroppedDirectories = (string[])e.Data.GetData(DataFormats.FileDrop, false);

它工作正常,但是当我从 Webbrowser 拖放“MyComputer”或其他东西时,我的程序会抛出 nullfrefferenceexception。

我的问题是下面获取数据方法的确切返回值是多少(当我在一瞬间拖放几个文件时)?

Data.GetData(DataFormats.FileDrop, false);

我假设我必须检查每个对象并消除空对象(然后我可以将没有空对象的数组转换为字符串 [],并且在进一步处理过程中我得到正确的路径并且没有 NRexceptions)。

此代码仍会引发 System.NullRefferenceException:

private void Directories_ListView_DragDrop(object sender, DragEventArgs e)
{
    object[] rawArray=(object[])e.Data.GetData(DataFormats.FileDrop, false);
    foreach (var s in rawArray)\\System.NullRefferenceException occurs..
    {
        try
        {
            if (!s.Equals(null))
            {
                LogList.Items.Add(DateTime.Now + " Item isnt Null");
            }
        }
        catch (Exception)
        {
            LogList.Items.Add(DateTime.Now + " Item is null");
            continue;
        }
   }
C# 数组 WinForms NullReferenceException 可为 null

评论

0赞 JamesFaix 8/3/2018
我认为您的问题是表达式,它要求不为空才能工作。Try 或 which are ,而不是基于实例。如果使用 C# 7,也可以工作,并且性能可能更高。s.Equals(null)sEquals(s, null)s == nullstatics is null

答:

0赞 Handbag Crab 8/3/2018 #1

我敢肯定,昨天我们已经为你回答了这个问题。在对列表项执行任何操作之前,需要检查它们。根据 Abion47 为您链接的文档,您将获得 null 值。

字符串是可为 null 的类型,因此昨天给出的答案仍然成立。如果您不喜欢围绕 ListViewItem 创建时的 try catch,则始终可以像上面所做的那样:首先检查 null。

if (e.Data.GetData(DataFormats.FileDrop, false) != null)
{
    string[] DroppedDirectories = (string[]) e.Data.GetData(DataFormats.FileDrop,false);
    List<string> directories = new List<string>();
    foreach(string dir in DroppedDirectories)
    {
        if (dir != null)
            directories.Add(dir);
    }

    // Now loop over the directories list which is guaranteed to have valid string items
}

GetData 的文档在这里

它指出它将尝试将其转换为您需要的任何格式。如果不能,则返回 null。昨天你想转换为字符串数组(DataFormat.FileDrop),但它会失败。

今天,您正在尝试转换为对象,并在同一个地方收到相同的错误。您仍在尝试将其转换为,这就是它返回 null 的地方。您仍然要求转换为,但不能。DataFormats.FileDropGetDataDataFormats.FileDrop

RecycleBin 和 Desktop 是特殊目录,我假设 DrapDrop 无法处理它们,因此转换失败并返回 null。

我试过:

var ob = e.Data.GetData(typeof(object));

当您包含回收站时,它仍然返回 null。如果尝试获取数据的数据类型,会发现数据的类型为:e.Data.GetType()

System.Windows.Forms.DataObject

您可以像以前一样防止 null 崩溃,也可以使用:

if (e.Data.GetDataPresent(DataFormats.FileDrop)

这将检查数据是否可以格式化为所需的类型。但它不能告诉你里面到底是什么类型的数据!

可悲的是,无论您做什么,似乎包括 RecycleBin 或 Desktop 总是无法转换。

您可以随时检查它是否转换,以及它是否没有向您的用户弹出一条消息,说他们不应该尝试删除回收站/桌面:

if (!e.Data.GetDataPresent(DataFormats.FileDrop)
{
    MessageBox("Please don't drop Recycle Bin or Desktop");
    return;
}

评论

0赞 TamaraL96 8/3/2018
我几乎理解你的意思,但是当您拖放几个元素(例如 2 个文件夹 + 我的电脑)时,什么都不会处理。当“mycomputer”元素与其他元素一起删除时,e.Data.GetData 方法似乎总是返回 null。这就是为什么我不明白这个方法到底返回了什么,以及如何测试它得到的每个元素。为了解决我的问题,我必须检测 e.Data.GetData 获取的每个 Null 元素,但我不知道如何执行此操作。这是这个问题的核心。
0赞 Handbag Crab 8/3/2018
我明白你现在在做什么。我已经更新了上面的答案。恐怕预后不好。
0赞 TamaraL96 8/3/2018
这就是为什么我不明白这个方法.当其中一个元素无法识别时,它总是返回 null(如我的电脑、bin 等)。另一方面,你可以强制转换它来获取字符串数组等的 System.object 数组。在这个地方,我以为我将能够检测到空对象,但这似乎是不可能的。@Abion47说了很多有用的东西,但这就是我的问题所在;)
0赞 Handbag Crab 8/3/2018
我尝试在if(e.Data.GetDataPresent)上放置一个断点,看看它是否会显示里面的数据类型,但即使这样也没有给出任何线索。不好意思。
0赞 TamaraL96 8/3/2018
别担心,我的应用程序仍然可以工作。我的想法很少,但时间不够。找到任何解决方案后,我会通知您。感谢您的贡献,尽管:)