2012-04-15 6 views
0

Ich habe eine Klasse Foo in C#, die einen String-Namen hat und ich möchte, dass jeder einen eindeutigen Namen hat. Ich wollte den Namen von einer statischen int-Variablen erhalten und sie dann einer lokalen Instanz-int-Variable zuweisen, der ich am Ende der Zeichenfolge hinzufüge. Dies funktioniert jedoch nicht, wie würde ich mein gewünschtes Ergebnis erzielen können.Weisen Sie jeder Instanz eines Objekts eine Nummer aus einem statischen int zu, um einen eindeutigen Namen zu geben C#

class Foo 
{ 
    static int count = 0; 
    int fooNum; 
    string name; 

    public Foo 
    { 
     ++count; 
     fooNum = count; 
     name = "Foo" + fooNum; 
     Console.WriteLine(name); 
    } 
} 

int main() 
{ 
    for(int i = 0; i < 5; i++) 
    { 
     Foo test = new Foo(); 
    } 
} 

tatsächliche Ausgang: Foo5 Foo5 Foo5 Foo5 Foo5

gewünschte Ausgabe: Foo0 Foo1 foo2 foo3 Foo4

Jede Hilfe sehr geschätzt

wäre

Danke

+0

Sie haben Code geschrieben, der nicht kompiliert ... –

+0

@MitchWheat. _ "Das funktioniert nicht obwohl" _... – gdoron

+0

"funktioniert nicht" bedeutet nicht "es kompiliert nicht" in meinem Buch .... Per Definition kann es nicht funktionieren, es sei denn es kompiliert ... Aber es kann 'nicht funktioniert', wenn es kompiliert auch ... –

Antwort

2

Ihr Code wird nicht kompiliert. Korrigieren Sie es zu:

class Foo 
{ 
    static int count = 0; 
    int fooNum; 
    string name; 

    public Foo() 
    { 
     ++count; 
     fooNum = count; 
     name = "Foo" + fooNum; 
     Console.WriteLine(name); 
    } 
} 

static void Main(string[] args) 
{ 
    for (int i = 0; i < 5; i++) 
    { 
     Foo test = new Foo(); 
    } 
} 

macht es kompilieren und arbeiten wie ein Charme. Er druckt

Foo1 
Foo2 
Foo3 
Foo4 
Foo5 
+0

So fand ich heraus, warum es nicht inkrementiert wurde. In meinem Code habe ich einen currentObject-Halter, der den Konstruktor nur einmal aufruft und dann, wenn er etwas zu einer Liste hinzufügt, führt er nur eine flache Kopie aus, die den Konstruktor nicht aufruft. Der Grund, warum es zu 1025 geht (in meinem Code nicht das Beispiel), liegt daran, dass ich den Konstruktor anrufe, um zuerst die Liste zu initialisieren. Um das alles zu korrigieren, habe ich eine Funktion erstellt, die die statische Variable inkrementiert. Vielen Dank, ich hätte immer gedacht, dass es nicht funktioniert, wenn ihr mir nicht gezeigt habt, dass ich recht habe. Danke nochmal allen! –

0

Dieser Code funktioniert wie erwartet:

namespace ConsoleApplication68 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      for (int i = 0; i < 5; i++) 
      { 
       Foo test = new Foo(); 
       Console.WriteLine(test.name); 
      } 
     } 
    } 

    class Foo 
    { 
     private static int count = 0; 
     public string name; 

     public Foo() 
     { 
      int fooNum = ++count; 
      name = "Foo" + fooNum; 
     } 
    } 
} 

Bitte beachten Sie, dass ich die Console.WriteLine() zu einer richtigen Stelle im Code verschoben haben.

0

Versuchen Sie Foos in eine generische Sammlung zu sammeln, wie zum Beispiel:

List<Foo> myFooList; 

Dann, wie Sie in mehr Foos zu Ihrer Liste hinzufügen, können Sie die Indexnummer verwenden, um sie zu identifizieren.

1

Mitch und Tudor hat richtig Beispiele, aber ich würde immer noch darauf hinweisen, warum Ihr Code nicht funktioniert:

Ihr Code funktioniert nicht, weil Sie Klammern auf Ihrem Foo Konstruktor fehlen, was bewirkt, dass die Code, um nicht zu kompilieren. Wenn Sie diesen Compilerfehler ignorieren, führen Sie wahrscheinlich einen früheren Build aus, der die Ausgabe erzeugt, die Sie sehen. Fix den Konstruktor und Sie werden sehen, dass Ihr Code wie erwartet funktioniert.

+0

+1. sich Zeit nehmen zu erklären –

Verwandte Themen