Microsoft 文档中为 Clipboard.ContainsImage()
提供的示例包括以下内容:
System.Drawing.Image returnImage = null;
if (Clipboard.ContainsImage())
{
returnImage = Clipboard.GetImage();
....
}
此方法的表面/标称行为是首先检查剪贴板是否包含图像,如果是,则获取该图像以供使用。返回 null
否则。
但是,在对 ContainsImage()
的调用之间是不是有可能并调用GetImage()
另一个应用程序更改了剪贴板的内容?毕竟可能没有图像数据。
当剪贴板不包含图像时,GetImage()
is documented返回 null
.很好,但是调用 ContainsImage()
有什么意义呢?首先,如果你调用GetImage()
无论如何都必须检查结果?
这不仅仅适用于此示例 - 调用 ContainsImage()
有什么用? 如果您真的需要剪贴板内容?
也许……
它比调用
GetImage()
更高效,因此即使在一小部分情况下也值得这样做GetImage()
会失败吗?一些魔法锁定会自动解决这个问题(非常怀疑)?
ContainsImage()
的情况如果您不需要获取剪贴板内容,只是为了查看它们是否是图像,可能会有用。
最佳答案
假设您有一个按钮,并且您希望只要剪贴板中有图像就启用,否则禁用它。
定期调用 ContainsImage()
不会产生很大的开销,因为它是一个标志,在将图像设置为剪贴板时只设置一次)。但是每次获取图像本身只是为了确保剪贴板中有图像是昂贵的。
一个不同的例子:
想象一下,您有一个可以包含视频、图像或音频的 byte[]
。
public enum MediaType
{
Audio,
Video,
Image,
None
}
class MyData
{
private byte mydata = null;
private MediaType type = MediaType.None;
public void SetData(byte[] data)
{
mydata = data;
if(ImageValidation()) // a method that validates data is a valid image
type = MediaType.Image;
else if(VideoValidation())
type = MediaType.Video;
else if(AutioValidation())
type = MediaType.Audio;
else
type = MediaType.None;
}
//I'm not going to create all get functions but just for one type
public bool ContainsImage() //costless
{
return type == MediaType.Image;
}
public Image GetImage() //costly if there is an image
{
if(type == MediaType.Image)
using (var ms = new MemoryStream(mydata))
{
return Image.FromStream(ms);
}
else
return null;
}
}
关于c# - Clipboard.ContainsImage() 可靠甚至有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55401512/