Benutzer mit den meisten Antworten
Macht man das so? Struct in einem Array von einem Singleton setzen und abfragen

Frage
-
Schönen guten Abend,
ich bin relativ neu mit C# unterwegs. Ich habe jahrelang Delphi (Pascal) programmiert und seit 2 Jahren Java.
Ich habe eine Klasse, die die Struktur meiner Daten hält.
namespace KECComputerMonitoring { public struct SMemory { public string name; public string capacity; public string speed; } public sealed class AssetData { private SMemory[] memory; /* ############################################################## */ // Encapsulated instance - the single instance - thread-safe private static readonly AssetData instance = new AssetData(); // Explicit static constructor to tell C# compiler not to mark type as beforefieldinit static AssetData() { } // Hide constructor private AssetData() { } // Return the single instance of this class. public static AssetData GetInstance { get { return instance; } } /* ############################################################## */ public SMemory[] Memory { get { return memory; } set { memory = value; } } }
Mit der Main Klasse hole ich mir jetzt die Instanz der Daten und ermittle mit WMI den Arbeitsspeicher.
namespace KECComputerMonitoring { class Program { static void Main(string[] args) { AssetData assetData = AssetData.GetInstance; int idx; // Local WMI Request string computername = "localhost"; ManagementScope scope = new ManagementScope("\\\\" + computername + "\\root\\cimv2"); scope.Connect(); ObjectQuery query = new ObjectQuery("Select * from Win32_PhysicalMemory"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); assetData.Memory = new SMemory[searcher.Get().Count]; idx = 0; foreach (ManagementObject obj in searcher.Get()) { assetData.Memory[idx].name = obj["DeviceLocator"].ToString(); assetData.Memory[idx].capacity = obj["Capacity"].ToString(); assetData.Memory[idx].speed = obj["Speed"].ToString(); idx++; } foreach (var obj in assetData.Memory) { Console.WriteLine(obj.name); Console.WriteLine(obj.capacity); Console.WriteLine(obj.speed); Console.WriteLine(""); } Console.ReadLine(); }
} }
Mein Lösungsweg funktioniert. Nur würde ich gerne wissen, ob das der richtige Weg ist. Die Singleton Klasse ist ok. Aber die Daten abspeichern stelle ich in Frage.
Vielen Dank im Voraus für alle Anregungen oder Verbesserungsvorschläge.
Mfg
Sven
- Bearbeitet Sven O Mittwoch, 27. Januar 2016 20:19
Antworten
-
Hallo Sven,
Strukturen (struct) sind in meinen Augen etwas schwierig wenn es darum geht wo man diese Sinnvoll einsetzen kann. Wann man genau Strukturen und wann Klassen einsetzen sollte kannst du meiner Meinung nach hier ganz gut nachlesen. Speziell die sehr positiv bewerteten Antworten entsprechen in etwa dem was mir auch meine Erfahrung sagt.
Ansonsten sehe ich keine Hinweise Darauf dass man etwas grundlegendes von dem Ändern sollte, was du angesprochen hast. Inwiefern Singleton hier Sinn macht musst du natürlich selbst Wissen. Beachte hier ggf. auch wenn mehrere Threads auf das Array zugreifen, dass es eventuell noch nicht komplett befüllt ist.
Was du aber beachten solltest sind die Konventionen. Also Beispielsweise öffentliche Eigenschaften anstelle von Feldern und die CamelCase-Schreibweise. Und auch wenn es kleinlich klingen mag, aber SMemory ist eine Struktur und keine Klasse und eine Main-Klasse gibt es nicht - nur eine so benannte Methode.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 29. Januar 2016 12:58
- Als Antwort markiert Aleksander Chalabashiev Freitag, 5. Februar 2016 10:27
Alle Antworten
-
Hallo Sven,
Strukturen (struct) sind in meinen Augen etwas schwierig wenn es darum geht wo man diese Sinnvoll einsetzen kann. Wann man genau Strukturen und wann Klassen einsetzen sollte kannst du meiner Meinung nach hier ganz gut nachlesen. Speziell die sehr positiv bewerteten Antworten entsprechen in etwa dem was mir auch meine Erfahrung sagt.
Ansonsten sehe ich keine Hinweise Darauf dass man etwas grundlegendes von dem Ändern sollte, was du angesprochen hast. Inwiefern Singleton hier Sinn macht musst du natürlich selbst Wissen. Beachte hier ggf. auch wenn mehrere Threads auf das Array zugreifen, dass es eventuell noch nicht komplett befüllt ist.
Was du aber beachten solltest sind die Konventionen. Also Beispielsweise öffentliche Eigenschaften anstelle von Feldern und die CamelCase-Schreibweise. Und auch wenn es kleinlich klingen mag, aber SMemory ist eine Struktur und keine Klasse und eine Main-Klasse gibt es nicht - nur eine so benannte Methode.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 29. Januar 2016 12:58
- Als Antwort markiert Aleksander Chalabashiev Freitag, 5. Februar 2016 10:27