Clipboard.ContainsImage()是否可靠甚至有用?

Dav*_*Caz 5 .net c# clipboard locking winforms

Microsoft文档中提供的示例Clipboard.ContainsImage()包括以下内容:

System.Drawing.Image returnImage = null;
if (Clipboard.ContainsImage())
{
    returnImage = Clipboard.GetImage();
    ....
}
Run Code Online (Sandbox Code Playgroud)

此方法的表面/名义上的行为是首先检查剪贴板是否包含图像,如果是,则获取该图像以供使用。null否则返回。

但是,在ContainsImage()GetImage() 另一个应用程序的调用与调用之间是否有可能更改了剪贴板的内容?毕竟可能没有图像数据。

当剪贴板不包含图像时,GetImage() 记录为返回null。很好,但是ContainsImage(),如果您在致电GetImage()时必须检查结果,那么首先致电的意义是什么?

这不仅适用于此示例- 如果您实际上需要剪贴板内容,那么调用将有什么用ContainsImage()

也许 ...

  • 它比调用更高效GetImage(),因此即使在少数情况下GetImage()失败,它也值得做?

  • 正在进行一些魔术锁定,这将自动解决此问题(高度可疑)?


ContainsImage()如果您不需要获取剪贴板内容,而只是查看它们是否为图像,那么可能是有用的情况。

Ash*_*ani 1

想象一下,您有一个按钮,并且您希望在剪贴板中有图像时启用它,否则禁用它。

定期调用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;
     }
}
Run Code Online (Sandbox Code Playgroud)