2016-03-22 10 views
0

Wenn cachePath wäre eine Zeichenfolge sein, die ich dieseXamarin.Forms: Vergleich Image

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

Jetzt cachePath vom Typ ImageSource. Wie kann ich vergleichen, ob value mit cachePath übereinstimmt? Derzeit mache ich das

if(this.cachePath == value) 

Ist das der einzige Weg? Oder wie kann Equals() dafür verwendet werden?

+1

Weil 'ImageSource' ist ein' Reference Type', der zwei 'ImageSources' vergleicht und die Referenzen vergleicht. NICHT die tatsächlichen Daten. Da 'String' eine' Wertart' ist, vergleicht der Vergleich die tatsächliche Zeichenkette und nicht die Referenz. Sie wollen in ein 'Byte []' konvertieren und die beiden Byte-Arrays vergleichen, um einen echten Vergleich zu erhalten. – user1

+0

Ich denke, dass es sehr zeitaufwendig wäre, ein ganzes Bild in ein 'byte []' zu lesen. Gibt es keine Möglichkeit zu wissen, ob die Referenzen auf dieselbe Ressource verweisen? – testing

+1

wenn die Referenzen identisch sind. I.e. 'this.cachePath' ist das gleiche Objekt wie' value'. d.h. 'this.cachePath = value ', dann prüft dies die Referenzen. ABER wenn 'cachePath' eine Kopie des image' value' ist, dann EVENTHO sind die Bilder das selbe Bild, weil sie nicht auf das selbe Objekt 'cachePath == Value' zeigen, würde 'false' zurückgeben – user1

Antwort

2

So kommt dies auf den uralten "Pass von Referenz"/"Pässe von Wert" Diskussion.

Da ImageSource ist ein Referenztyp vergleicht zwei ImageSources wird die Referenzen vergleichen. NICHT die tatsächlichen Daten.

weil String ist ein Wert Typ der Vergleich WILL die tatsächliche Zeichenfolge vergleichen und nicht die Referenz.

Für einen wahren Vergleich Ihrer ImageSource wollen ein Byte[] und vergleichen Sie die zwei Byte-Arrays konvertieren, da diese Werttypen auf Ihre Frage

Bezug nehmend wird:

Wenn this.cachePath ist das gleiche Objekt als value. dh:

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

ABER wenn cachePath ist eine Kopie des Bildes value dann eventho die Bilder gleich sind, weil ihre Referenzen nicht auf das gleiche Objekt zeigen werden

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