2017-09-25 2 views
-2

Ich bin auf einem Upgrade-Projekt und vor kurzem aufgetretene Probleme mit der aktualisierten Version einer DLL. Ich dekompilierten die ursprüngliche DLL und fanden die folgende if-Anweisung:Was ist dieser Operator, "??"

if (fieldConfiguration == null && Context.ContentDatabase != null) 
{ 
    Item obj = Context.ContentDatabase.SelectSingleItem(
     string.Format("//*[@@templateid='{0}' and @@key='{1}']", 
      (object) TemplateIDs.TemplateField, (object) fieldName)); 
} 

ich dann die aktualisierte Version der DLL dekompilierten und die Erklärung war wie folgt:

if (fieldConfiguration == null && (Context.ContentDatabase ?? Context.Database) != null) 
{ 
    Item obj = Context.ContentDatabase.SelectSingleItem(
     string.Format("//*[@@templateid='{0}' and @@key='{1}']", 
      (object) TemplateIDs.TemplateField, (object) fieldName)); 
} 

konnte ich den Code, um durch durch Dekompilieren der DLLs mit dotPeek und Verwenden der dotPeek-Symbolserverfunktionalität. Ich kann sehen, dass der Code bei Verwendung der Aktualisierungs-DLL fehlschlägt, da Context.ContentDatabase null ist. Was ich nicht verstehe, ist, wie dieser doppelte ternäre Operator ausgewertet wird. Könnte jemand für mich klären, was dort vor sich geht? Es scheint, als ob die Ersteller dieser Assembly eine Nullprüfung für Context.ContentDatabase wollten, aber möglicherweise einen Fehler gemacht haben. Danke für die Hilfe!

+3

Rufst du den binären Null-coalesce Operator ('' ??) "ternäre"? –

+0

Yep, wusste nicht, dass es so heißt haha ​​ –

+0

Also "doppelt ternär" bedeutet "Zwei Fragezeichen"? Unary bedeutet, dass es etwas von etwas gibt, binär bedeutet zwei von etwas, ternär bedeutet drei, quaternär sollte offensichtlich sein. –

Antwort

2

Nun ja, das sieht aus wie ein Fehler. Der Code wird gesucht, ob Context.ContentDatabase oder Context.Database nicht null sind, und dann weiterhin die erstere verwendet, auch wenn es null war.

Der Code sollte wie folgt aussehen:

var database = Context.ContentDatabase ?? Context.Database; 

if (fieldConfiguration == null && database != null) 
{ 
    Item obj = database.SelectSingleItem(
     string.Format("//*[@@templateid='{0}' and @@key='{1}']", 
      (object) TemplateIDs.TemplateField, (object) fieldName)); 
} 

Wo es die Datenbank in einer separaten Variable speichert den Null-Koaleszenz-Operator und arbeitet dann auf, dass, wenn es nicht null ist.

Sie sollten sich also an das Team wenden, das diese Bibliothek bereitstellt und einen Fehler mit ihnen meldet.

+0

Danke! Das war, was ich dachte, basierend auf meinem Debugging, aber wollte eine zweite Meinung, bevor Sie die rote Flagge heben. Sieht aus wie ein erfahrener neuer Operator! –

+0

Dies ist in einer 3rd-Party-DLL, also nahm ich an, dass er keine Governance darüber hat. Es ist jedoch möglich, eine Assembly nach der Dekompilierung und Modifikation zu kompilieren, ich habe es in der Vergangenheit gemacht. Aber das kann eine Sackgasse sein, wenn Sie die Software freigeben müssen oder Sie irgendwelche Rechte verletzen. –

0

Angenommen, Context.ContentDatabase und Context.Database sind identisch. Der folgende Code sollte funktionieren.

var contentDatabase = Context.ContentDatabase ?? Context.Database; 
if (fieldConfiguration == null && contentDatabase != null) 
{ 
Item obj = contentDatabase.SelectSingleItem(
    string.Format("//*[@@templateid='{0}' and @@key='{1}']", 
     (object) TemplateIDs.TemplateField, (object) fieldName)); 
} 
+0

Ich habe in diesem Fall keinen Zugriff auf den Quellcode, aber ich kann das definitiv mitschicken, wenn ich die rote Flagge hebe. Vielen Dank! –