【问题标题】:Xamarin.Forms: Comparing ImageSourceXamarin.Forms:比较 ImageSource
【发布时间】:2016-03-22 09:44:37
【问题描述】:

如果cachePath 是一个字符串,我可以这样做

if(value.Equals(this.cachePath, StringComparison.Ordinal))

现在cachePath 的类型为ImageSource。如果valuecachePath 相同,我该如何比较?目前我正在这样做

if(this.cachePath == value)

这是唯一的方法吗?或者Equals()如何用于此?

【问题讨论】:

  • 因为ImageSourceReference Type,比较两个ImageSources 将比较参考。不是实际数据。因为StringValue Type,所以比较将比较实际字符串而不是参考。您想转换为Byte[] 并比较两个字节数组以获得真正的比较
  • 我认为将整张图片读入byte[] 会非常耗时。有没有办法知道引用是否指向同一个资源?
  • 如果引用相同。 IE。 this.cachePathvalue 是同一个对象。即this.cachePath = value 然后这是检查参考。但是如果cachePath 是图像value 的副本,那么即使图像是相同的图像,因为它们没有指向同一个对象cachePath == Value 将返回false
  • OK,在pass-by-reference/pass-by-value的规则之后。如果您愿意,可以将您的 cmets 总结为一个答案。

标签: xamarin comparison xamarin.forms imagesource


【解决方案1】:

所以这归结为古老的“按引用传递”/“按值传递”讨论。

因为ImageSource 是一个引用类型,比较两个ImageSources 将比较引用。 不是实际数据。

因为String 是一个值类型,所以比较比较实际字符串而不是引用。

为了真正比较您的ImageSource,您希望转换为Byte[] 并比较两个字节数组,因为它们将是值类型

关于您的问题:

如果this.cachePath 是与value 相同的对象。即:

this.cachePath = value
this.cachePath == value
//Returns true

但是如果cachePath是图像value的副本,那么EVENTHO图像相同,因为它们的引用是不指向同一个对象

this.cachePath = new ImageSource();
this.value = new ImageSource(cachePath.Source);
this.cachePath == Value 
// Returns False 

【讨论】:

    【解决方案2】:

    这个问题的另一种替代解决方案是创建您自己的自定义图像对象,如下所示:

    public class MyImage : Image
    {
       public string CompareName { get; set; }
    }
    

    因此,MyImage 类将具有其基 Image 类的所有属性,此外,它还将具有一个 CompareName 属性。每当您设置对象的 ImageSource 时,您都可以为其命名以供将来进行比较操作。我认为这将是一个比比较整个图像源文件更好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 2014-11-21
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      相关资源
      最近更新 更多