C# Frage

Michael-D

Cadet 3rd Year
Registriert
Nov. 2023
Beiträge
35
Schönen guten Tag zusammen,

ich habe mich bewusst hier angemeldet, da ich in den letzten Tagen bei der Googlesuche immer mal wieder auf dieses Forum gestoßen und musste auch manchmal etwas schmunzeln, dass so einige Mitglieder hier etwas in der Art "... Hausaufgaben werde nier nicht gemacht..." geschrieben haben. Kann ich absolut verstehn und mit 54 Jahren geht es auch manchmal etwas langsamer und brauch auch keine Hausaufgaben mehr zu machen. Ist ja auch schon 40 Jahre her :D

Ich habe vor einigen Wochen mich mit der C# Programmierung befasst, da ich mich schon seit langer Zeit über die Hardware und deren Infos brennend interessiere. Ich versuche immer, Probleme selbst zu lösen oder es zu versuchen - so weit es geht. Aber hier gehts im Moment absolut nicht mehr und OOP ist schon echt der Hammer :pcangry: Einiges Grundwissen von TP aus den 90-er jahren habe ich noch, aber das reicht bei weitem nicht mehr und tue ich mich schon etwas schwer, was OOP angeht. Dabei fange ich ja gerade erstmal an :(

Basierend auf der Seite von Microsoft unter DriveInfo.GetDrives Methode werden vorhandene Laufwerke per System.IO abgefragt. Ich habe im Internet etwas Interessantes über Laufwerkstyp per .NET-Framework ermitteln gefunden.

Was mich interessiert ist, warum man einen Zähler (int counter = 0; ) für die Anzahl der Laufwerke nicht außerhalt der foreach Schleife platzieren kann. Hier ein Beispiel...

Code:
class Program
    {
        static void Main(string[] args)
        // private void Main(string[] args)
        {
            int counter = 0;     // Zähler für die Anzahl Logischer Laufwerke
            // counter++;       // Zähler um +1 erhöhen - funktioniert aber nicht!

            Console.WriteLine("Vorhandene Logische Laufwerke..." + counter); // Das funktioniert nicht!!!

            Console.WriteLine("\n");    // Zeilenvorschub

            foreach (DriveInfo di in DriveInfo.GetDrives())
            {
                // Console.WriteLine("Vorhandene Logische Laufwerke...");
                counter++;  // Zähler um +1 erhöhen
                Console.WriteLine("Laufwerk: " + "{0} Typ: {1}", di.Name, di.DriveType.ToString());
            }

            Console.WriteLine("\nVorhandene Logische Laufwerke..." + counter); // Das funktioniert!!!
            Console.WriteLine("\n[Enter] zum Beenden drücken...");  // ESC Sequenz '\n' LF setzen
            Console.ReadLine(); // Auf Tastendruck warten

        } // end Static Void
    } // end Class

Nun frage ich mich aber, warum das denn nicht so funktioniert...
Code:
Console.WriteLine("Vorhandene Logische Laufwerke..." + counter); // Funktioniert nicht!

Könnte es sein, dass die Variable counter nicht im sogenannten Scope (Gültigkeitsbereich) ist? Bedeutet das , das eine Variable immer nur innerhalb der geschweiften Klammer gültig ist? Das heißt aber auch, das außerhalb der geschweiften Klammer nicht auf diese Variable zugegriffen werden!

Setze ich die Variable counter innerhalb der foreach Schleife, dann funktioniert es!
Code:
Console.WriteLine("\nVorhandene Logische Laufwerke..." + counter); // Das funktioniert!!!

Das ist dann die Bildschirmausgabe... Oben steht der Wert 0 - unten dann auch richtig der Wert 6
Vorhandene Logische Laufwerke...0

Laufwerk: C:\ Typ: Fixed
Laufwerk: D:\ Typ: Fixed
Laufwerk: E:\ Typ: Fixed
Laufwerk: F:\ Typ: Fixed
Laufwerk: G:\ Typ: Fixed
Laufwerk: H:\ Typ: Fixed

Vorhandene Logische Laufwerke...6

[Enter] zum Beenden drücken...

Könnte mir denn mal jemand BITTE sagen, was hier falsch ist? Variable auf "Global" setzen ? Wie denn? Vielleicht bin ich ja auch etwas kleinkariert, aber mich würde schon sehr interessieren, warum das so nicht geht!

Ich bedanke mich schon jetzt für Eure Vorschläge und bedenkt... "Ich bin noch Anfänger" ;)

Gruß aus der Eifel (bei Köln)
 
Lösung
Hier noch einmal eine Zusammenfassung, wie bei mir der Code aussehen würde (im Sinne einer einfachen Konsolenanwendung):
C#:
class Program
{
    static void Main(string[] args)
    {
        int AnzahlLaufwerke = DriveInfo.GetDrives().Count();
  
        Console.WriteLine($"Vorhandene Logische Laufwerke... {AnzahlLaufwerke}");
        Console.WriteLine("\n");

        foreach (DriveInfo di in DriveInfo.GetDrives())
        {
            Console.WriteLine($"Laufwerk: {di.Name} Typ: {di.DriveType.ToString()}");
        }

        Console.WriteLine("\n");
        Console.WriteLine("Beliebige Taste zum Beenden drücken...");
        Console.ReadLine();
    }
}

Ausgabe sähe dann wie folgt aus:
Code:
Vorhandene Logische Laufwerke... 6...
Bohnenhans schrieb:
Das was Du offensichtlich willst ist wohl das hier

Code:
...        
int counter = DriveInfo.GetDrives().Count();
...

fexxianosch schrieb:
Lösungsvorschlag:
Um jetzt die Anzahl der Laufwerke vorab zur Verfügung zu haben, müssen wir die Anzahl der Elemente aus dem oben erwähnten Array schon vorher zur Verfügung stehen haben.

Das ließe sich wie schon von @Bohnenhans bereits erwähnt mit:
C#:
DriveInfo.GetDrives().Count()
bewerkstelligen.

So Ihr Zwei,
jetzt seit doch mal so nett und erklärt mir doch mal bitte, woher Ihr das mit dem .Count(); her habt. Steht das irgendwo in der System.IO oder ist es aus Eurer Erfahrung?

Aufschreiben kann ich ja viel, aber mich interessiert es ja auch, woher das kommt. Sonst lern ich doch nix :(

Danke schon mal vorab und schönen Abend noch :schluck:
 
Kurz und knapp: Ist in C# für Arrays implementiert. Sowohl aus Erfahrung, als auch kann man das in der C# Dokumentation nachschauen.

Das Lang und ausführlich zu Erklären wäre noch nicht angebracht, weil, wenn du weiterhin C# lernst, du ab einem gewissen Punkt die entsprechenden Paradigmen der OOP eh noch kennen lernen wirst.

Da du vermutlich da noch eher in einem frühen Lernstadium bist, wäre das so wie wenn jemand untrainiertes, der sich im Fitnessstudio angemeldet hat, dort dann 2 mal war und direkt 150kg mit der Langhantel stemmen will...

Wenn du dich aber jetzt schon wirklich da reinlesen willst, dann solltest du dir ggf. vorher mal "Vererbung" und "Interfaces" bzw. "abstrakte Klassen" zu Gemüte führen. Kleine Warnung, das sind relativ abstrakte und umfangreiche Konzepte/Paradigmen...

edit: Hier gäbe es übrigens akzeptables "Einsteigermaterial"
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Michael-D
Kleine Korrektur meinerseits. Die Implementierung für Arrays heißt .Length und ist ein Property und keine Methode. Du kannst also auch schreiben DriveInfo.GetDrives().Length.
Wenn du im Visual Studio hinter das DriveInfo.GetDrives() mal einen Punkt setzt, so werden dir eine Menge Funktionen angeboten. Die meisten davon stehen für alle "Listen" (Array ist eine spezielle Liste) zur Verfügung. Das Stichwort wäre Linq, wenn du dich damit näher beschäftigen willst. Zu diesen allgemeinen Funktionen gehört auch .Count().
 
  • Gefällt mir
Reaktionen: Michael-D
efcoyote schrieb:
Die meisten davon stehen für alle "Listen" (Array ist eine spezielle Liste) zur Verfügung. Das Stichwort wäre Linq, wenn du dich damit näher beschäftigen willst. Zu diesen allgemeinen Funktionen gehört auch .Count().
LINQ ist doch ein wenig umfassender... würde ich noch nicht empfehlen.
 
  • Gefällt mir
Reaktionen: f00bar und Michael-D
Der Wikipedia Artikel ist wie ich finde sehr gut verständlich. Das lässt sich fast so lesen wie ein Satz. Und der TE wird schon merken, ob es dafür noch zu zeitig ist. Zu mal LINQ ein wenig das Killer-Feature von C# ist.
 
  • Gefällt mir
Reaktionen: Michael-D und fexxianosch
Es gibt ja von MS die kostenlose Visual Studio Community Version https://visualstudio.microsoft.com/de/vs/community/ die hat auch Code Completion und bietet für alle Objekte implementierte Methoden und Attribute die Vorschläge

Wenn man sie nicht kennt ist die Chance gross dass man so eine passende findet die Namen sind ja meist selbsterklärend :-)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Michael-D, efcoyote und fexxianosch
Du kannst auch links am Rand einen Breakpoint setzen, indem Du neben die Zeilennummer klickst, dann erscheint dort ein roter Kreis. Startest Du das Programm mit F5, hält es an, wenn es die Zeile mit dem Breakpoint ausführen will. Dann kannst Du Dir den Zustand (Variablen, Call Stack, Threads etc.) und von dort aus auch Zeile für Zeile weitergehen mit F10 (geht nicht in Methodenaufrufe rein) oder F11 (geht auch in die Methodenaufrufe rein).

Das nennt sich Debuggen. ;) Hilft ungemein bei Fehlersuche bzw ohne geht es kaum.

Edith: Oh das bezog sich hier drauf:

Michael-D schrieb:
Das wusste ich in der Tat noch nicht! Danke für die Info ;)

Hab mir das bei MS unter Tastenkombinationen in Visual Studio mal angeschaut. Ist ja echt Wahnsinn.

Hab nicht gesehen, dass es noch Posts danach gab...
 
  • Gefällt mir
Reaktionen: Michael-D
Drexel schrieb:
Du kannst auch links am Rand einen Breakpoint setzen, indem Du neben die Zeilennummer klickst, dann erscheint dort ein roter Kreis. Startest Du das Programm mit F5, hält es an, wenn es die Zeile mit dem Breakpoint ausführen will. Dann kannst Du Dir den Zustand (Variablen, Call Stack, Threads etc.) und von dort aus auch Zeile für Zeile weitergehen mit F10 (geht nicht in Methodenaufrufe rein) oder F11 (geht auch in die Methodenaufrufe rein).

Das nennt sich Debuggen. ;) Hilft ungemein bei Fehlersuche bzw ohne geht es kaum.
Ja kenn ich und hats damals auch gegeben. Vielen Dank trotzdem für die Info ;)
 
Michael-D schrieb:
So Ihr Zwei,
jetzt seit doch mal so nett und erklärt mir doch mal bitte, woher Ihr das mit dem .Count(); her habt. Steht das irgendwo in der System.IO oder ist es aus Eurer Erfahrung?

Aufschreiben kann ich ja viel, aber mich interessiert es ja auch, woher das kommt. Sonst lern ich doch nix :(

Danke schon mal vorab und schönen Abend noch :schluck:
Um die anderen Fragen nochmal etwas konkreter abzuschließen: Hier siehst Du alles was mit Arrays bzw allgemein IEnumerable geht: https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable?view=net-7.0

Da ist auch das Count bei.
Um das vollständig zu verstehen muss man natürlich Interfaces etc. verstehen. Kommt Zeit kommt Rat. ;)
 

Ähnliche Themen

Zurück
Oben