2017-05-25 3 views
1

Das Problem ist in der Mitte der Haupt an der Linie, dieWie kann ein Objekt nicht gleich sein? (SSIS Script Task)

if ((byte[])Dts.Variables["User::EncryptionKey"].Value == noKey) 

liest Wenn GetEncryptionKey ‚versagt‘ und gibt NOKEY, das ‚wenn‘ noch nimmt den ‚else‘ Weg und ich don Warum nicht? Ich habe das mit identischen Ergebnissen versucht.

if (noKey.Equals((byte[])Dts.Variables["User::EncryptionKey"].Value)) 

Es sei denn, jeder Hinweis auf NOKEY ist irgendwie eine neue Kopie von Byte Instanziieren [0] Ich sehe nicht, wie sie ungleich sein können. Ich bin viele Male durchgetreten und sie sehen auf jeden Fall gleich aus.

private static byte[] noKey = new byte[0]; 

    public void Main() 
    { 
     int keyLen = 32; 
      Dts.Variables["User::EncryptionKey"].Value = 
       GetEncryptionKey((string)Dts.Variables["User::EncryptionKeyAsHex"].Value, keyLen); 

     if ((byte[])Dts.Variables["User::EncryptionKey"].Value == noKey) 
     { 
      Dts.TaskResult = (int)ScriptResults.Failure; 
     } 
     else 
     { 
      Dts.TaskResult = (int)ScriptResults.Success; 
     } 
    } 

    private static byte[] GetEncryptionKey(string hexString,int numBytes) 
    { 
      return noKey; //<-this definitely does get hit! 
    } 
+4

Nun, Sie führen einen Referenzvergleich durch. Wenn das Zuweisen zu der "Value" -Eigenschaft (oder das Abrufen) eine Kopie des Arrays annimmt, würde das Dinge erklären ... kannst du das auf ein [mcve] reduzieren? (Es gibt eine Menge Code hier, von denen die meisten aussehen, als wäre es unnötig, dies zu reproduzieren ...) –

+2

Mögliches Duplikat von [Überprüfung der Gleichheit für zwei Byte-Arrays] (https://stackoverflow.com/questions/18472867/checking-equality -für-zwei-Byte-Arrays) – Eris

+0

Sieht so aus, als ob Sie auf Autoboxing stolpern. Siehe "[Vergleichen Sie zwei Arrays von Primitiven in Java?] (Https://stackoverflow.com/questions/630808/compare-two-arrays-of-primitives-in-java)". –

Antwort

0

Ich glaube, Sie das Konzept verwechselst hier, zwei Array sind nicht die gleichen, weil sie die gleichen Elemente auf sie teilen. Der Operator == ruft ReferenceEquals auf und überprüft, ob beide Elemente auf denselben Speicherbereich verweisen.

Werfen Sie einen Blick auf den Unterschied hier C# .Equals(), .ReferenceEquals() and == operator

Versuchen Sie, die @Eris Ansatz zu verwenden. Hoffe, diese Hilfe

1

Hier ist das Problem lag: "Wenn nicht jede Bezugnahme auf NOKey irgendwie eine neue Kopie von Byte [0] instanziiert sehe ich nicht, wie sie ungleich sein können." Es ist mir nie in den Sinn gekommen, dass Dts .... Value.set derjenige war, der eine neue Kopie erstellte.

Also danke an Ed Plunkett für den Vorschlag, ich schaue mir das an, weil es sich als wahr herausgestellt hat.

Das Speichern des zurückgegebenen Wertes in einer lokalen Variablen zur Verwendung im Vergleich vermeidet das Problem.

Verwandte Themen