Wird der C# Compiler diesen Code optimieren?C#

Ein Treffpunkt für C#-Programmierer
Guest
 Wird der C# Compiler diesen Code optimieren?

Post by Guest »

Ich bin häufig in dieses Szenario stoße. Auf den ersten Blick denke ich: "Das ist eine schlechte Codierung. Ich führe eine Methode zweimal aus und bekomme notwendigerweise das gleiche Ergebnis. " Aber wenn ich darüber nachdachte, muss ich mich fragen, ob der Compiler so schlau wie ich ist und zu dem gleichen Schluss kommen kann. < /P>

Code: Select all

var newList = oldList.Select(x => new Thing {
FullName = String.Format("{0} {1}", x.FirstName, x.LastName),
OtherThingId = x.GetOtherThing() != null : x.GetOtherThing().Id : 0 // Might call x.GetOtherThing() twice?
});
< /code>

Hängt das Verhalten des Compilers vom Inhalt der Getotherthing < /code> -Methode ab? Sagen Sie, es sieht so aus (im Moment etwas ähnlich wie bei meinem wirklichen Code): < /p>

public OtherThing GetOtherThing() {
if (this.Category == null) return null;
return this.Category.OtherThings.FirstOrDefault(t => t.Text == this.Text);
}
< /code>

, das wird, abgesehen von sehr schlecht behandelten asynchronen Änderungen an dem, was diese Objekte stammen, auf jeden Fall dasselbe zurück, wenn sie zweimal hintereinander ausgeführt werden. Aber was ist, wenn es so aussah (unsinniges Beispiel für die Argumentation): < /p>

public OtherThing GetOtherThing() {
return new OtherThing {
Id = new Random().Next(100)
};
}
< /code>

Das Ausführen dieser zweimal in einer Zeile würde zur Erstellung von zwei verschiedenen Objekten führen, mit unterschiedlichen IDs aller Wahrscheinlichkeit nach. Was würde der Compiler in diesen Situationen tun? Ist es so ineffizient wie es zu tun, was ich in meiner ersten Auflistung gezeigt habe?   Ich habe dieser ersten Code -Auflistung etwas sehr ähnliches ausgeführt und einen Haltepunkt in die Getotherthing 
Instanzmethode eingerichtet. Der Haltepunkt wurde einmal getroffen. Es sieht also so aus, als wäre das Ergebnis tatsächlich zwischengespeichert. Was würde im zweiten Fall passieren, wo die Methode jedes Mal etwas anderes zurückgeben könnte? Würde der Compiler falsch optimieren? Gibt es Vorbehalte für das Ergebnis, das ich gefunden habe? Diese Schlussfolgerung war ungültig. Siehe Kommentare unter der Antwort von @usr.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post