2009-02-26 14 views
0

int in Könnte jemand die Zeit nehmen, mir die Sprache Untermauerung hier zu erklären:Wirkung von Gießen C#

int foo = myObject.SomeList.Count; 
for (int i = 0 ; i < foo ; i++) 
{ 
    myObject.SomeList.Add(bar); 
} 

geht in eine Endlosschleife, weil foo verweist auf einen Wert, der erhöht werden immer wieder. Ändern der ersten Zeile:

int foo = (int)myObject.SomeList.Count; 

macht es gehen weg, irgendwie foo von Referenz ändert ein für alle Mal zu schätzen wissen. Das ist wahrscheinlich ein Lehrbuch, aber warum passiert das?

Vielen Dank

EDIT: Ok, wie Patrick erwähnt, die Endlosschleife geschieht nur, wenn es keine vorherige Lagerung zu foo ist, die Besetzung sinnlos ist, was Sinn macht. Das ist in der Tat, was ich anfangs beim Debuggen dachte. Daher meine Überraschung, als die Besetzung es reparierte. Was tatsächlich passiert ist, dass ich von Visual Studio in die Irre geführt wurde, dass ich es repariert hatte, als es tatsächlich ein Problem der Synchronisation zwischen bearbeitetem Code und ausgeführtem Code gab, was zu falschen Schlussfolgerungen führte.

+0

Welche Version von .Net und C#? – zendar

+0

Bitte senden Sie ein kurzes, aber vollständiges Programm, das dieses Problem veranschaulicht. Etwas, das direkt in eine Datei "program.cs" in Visual Studio eingefügt, kompiliert und ausgeführt werden kann. –

Antwort

8

Ich habe dies auf meinem System versucht und kann Ihr Problem nicht replizieren. Ich konnte es jedoch replizieren mit dem folgenden Code, vielleicht ist es das, was Sie gemeint:

// SomeList is not empty before the loop 
for (int i = 0; i < myObject.SomeList.Count; i++) 
{ 
    myObject.SomeList.Add(bar); 
} 

In diesem Fall sind wir nicht der Graf in einem int Speicherung werden, so dass jedes Mal, wenn wir in die Liste aufnehmen, wir i vergleichen +1 mit Count + 1, daher die Endlosschleife.

+0

Wahrscheinlich ist das, was er meint, aber das explizit erwähnte OP (int) myObject.SomeList.Count macht einen Unterschied, der unmöglich ist. –

6

Sind Sie sicher? !!

int ist ein Werttyp. Das soll nicht passieren.

Jon Skeet, komm und hilf!

4

Das Verhalten, das Sie beschreiben, kann in C# nicht vorkommen. Sie haben den Wert von foo in beiden Fällen explizit als int deklariert. Dies ist ein Werttyp. Per Definition ist die Instanz, auf die foo zeigt, von der ursprünglichen Instanz in myObject.SomeList.Count getrennt.

Können Sie ein ausführlicheres Codebeispiel posten?