Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在从剪贴板获取数据之前,我是否应该始终调用ContainsData?_C#_Clipboard - Fatal编程技术网

C# 在从剪贴板获取数据之前,我是否应该始终调用ContainsData?

C# 在从剪贴板获取数据之前,我是否应该始终调用ContainsData?,c#,clipboard,C#,Clipboard,在阅读了一些有关从剪贴板获取数据的MSDN帖子之后,这些帖子似乎建议在从剪贴板获取数据之前调用ContainsData方法 在我看来,这似乎有点不必要,我不确定这样做是否有充分的理由,或者我是否没有理解MSDN说明 说: 首先使用相应的ContainsFormat方法确定数据是否以特定格式可用 说: 在检索剪贴板之前,请使用ContainsData方法确定剪贴板包含的数据是指定格式的数据还是兼容格式的数据 这是我的方法: // Should return null if no text is f

在阅读了一些有关从剪贴板获取数据的MSDN帖子之后,这些帖子似乎建议在从剪贴板获取数据之前调用ContainsData方法

在我看来,这似乎有点不必要,我不确定这样做是否有充分的理由,或者我是否没有理解MSDN说明

说:

首先使用相应的ContainsFormat方法确定数据是否以特定格式可用

说:

在检索剪贴板之前,请使用ContainsData方法确定剪贴板包含的数据是指定格式的数据还是兼容格式的数据

这是我的方法:

// Should return null if no text is found on the Clipboard.
public string GetText()
{
    if (!Clipboard.ContainsData(DataFormats.Text))
        return null;

    // GetData returns null if the clipboard is empty of does not match the format.
    return Clipboard.GetData(DataFormats.Text) as string;
}
我意识到我可能正在使用
ContainsText
GetText
(尽管
GetText
返回
String.Empty
如果没有找到文本,这是不理想的,因为我们不知道它是否无法获取任何文本,或者剪贴板是否真的包含空字符串)


无论如何,一位评论员问我为什么会有if语句,我的回答“因为MSDN告诉我是这样”似乎有点不理解(我就是这样)。有人能解释一下吗?我需要if语句吗?

我真的认为你需要它。原因如下:

如果此方法找不到指定格式的数据,将尝试 将数据转换为格式。如果数据无法转换为 指定的格式,或者如果数据是用自动 转换设置为false时,此方法返回null

所以它基本上告诉你这是因为健壮的编程。您必须获得与您的意图一致的结果:当对象不为空时,从该对象获取
null
,可能会导致问题

经过进一步考虑,我意识到问题不在于if语句本身,而在于返回的值,因为如果剪贴板中的数据无法转换,GetData方法已经返回null,因此它是多余的,可能实际上是无用的,考虑不提供任何附加信息,说明数据是否无法转换或实际上是空的

此时,我将编写如下方法:

public bool isClipboardDataValid(out string _data)
{
    bool _isValid = false;
    if (Clipboard.ContainsData(DataFormats.Text))
    {
        _data = Clipboard.GetData(DataFormats.Text);
        _isValid = true;
    }
return _isValid;
}

然后调用此方法,从而获得额外信息。

您试图解决的问题是什么?它是否抛出异常?“那么,我们不知道它是否无法获取任何文本,或者剪贴板是否真的包含空字符串”--这说明了为什么您可以调用
ContainsData()
:以了解它是否真的存在。我可以删除if语句吗?我不会将这些MSDN注释作为使用说明或指导阅读,如果你只是想偷看一下剪贴板,那么作为辅助信息的片段会有所帮助。我不知道,如果你这样做会发生什么?您希望
GetText()
在“剪贴板中没有文本”上返回null还是空字符串?Arggh,当文档明确建议向代码中添加竞态条件时。此外,所有对象都有
.ToString()
表示,因此在文本的情况下,如果它确实尝试将任何数据转换(而不仅仅是强制转换)为该格式,你可能会得到非常奇怪的结果。