Является ли Clipboard.ContainsImage () надежным или даже полезным? - PullRequest
5 голосов
/ 28 марта 2019

Пример, приведенный в документации Microsoft для Clipboard.ContainsImage(), включает следующее:

System.Drawing.Image returnImage = null;
if (Clipboard.ContainsImage())
{
    returnImage = Clipboard.GetImage();
    ....
}

Поверхностное / номинальное поведение этого метода состоит в том, чтобы сначала проверить, содержит ли буфер обмена изображение, и, если да, получить это изображение для использования. Вернуть null в противном случае.

Однако, возможно ли, что между вызовом ContainsImage() и вызовом GetImage() другое приложение изменило содержимое буфера обмена ? В конце концов, возможно, нет никаких данных изображения.

Если в буфере обмена нет изображения, GetImage() документируется для возврата null. Хорошо, но тогда какой смысл вначале звонить ContainsImage(), если при звонке GetImage() все равно обязательно проверять результат?

Это относится не только к этому примеру - какой смысл использовать вызов ContainsImage() , если вам действительно нужно содержимое буфера обмена?

Может быть ...

  • Это более производительно, чем вызов GetImage(), поэтому его стоит делать, хотя в небольшом% случаев GetImage() не удастся?

  • Происходит какое-то магическое блокирование, которое автоматически решает эту проблему (весьма сомнительно)?


Случай, когда ContainsImage() может быть полезен, может быть, если вам не нужно получать содержимое буфера обмена, просто чтобы посмотреть, являются ли они изображениями.

1 Ответ

1 голос
/ 28 марта 2019

Представьте, что у вас есть кнопка, и вы хотите включить ее, если в буфере обмена есть изображение, и отключить его в противном случае.

регулярный вызов 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;
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...