Laden...

Verständnisfrage: Wertezuweisung im statischen Feld

Erstellt von LittleTester vor einem Jahr Letzter Beitrag vor einem Jahr 438 Views
L
LittleTester Themenstarter:in
158 Beiträge seit 2019
vor einem Jahr
Verständnisfrage: Wertezuweisung im statischen Feld

Ich habe da ein Verständnisproblem.
Folgender Code wirft Fehler:

Fehler CS1023 Eine eingebettete Anweisung kann keine Deklaration und keine Anweisung mit Bezeichnung sein.


public string? SystemBitlockerState { get; private set; }

public static string GetSystemBitlockerState()
{
    IShellProperty prop = ShellObject.FromParsingName("C:").Properties.GetProperty("System.Volume.BitLockerProtection");
    int? bitLockerProtectionStatus = (prop as ShellProperty<int?>)?.Value;
     if (bitLockerProtectionStatus.HasValue && (bitLockerProtectionStatus == 1 || bitLockerProtectionStatus == 3 || bitLockerProtectionStatus == 5))
        string SystemBitlockerState = "Aktiviert"; // Fehler hier
    else
        string SystemBitlockerState = "Deaktiviert"; // Fehler hier
    return SystemBitlockerState; // Fehler hier
}
//  // Lässt man das "string" weg gibt es den Fehler "Fehler	CS0120	Für das nicht statische Feld, die Methode oder die Eigenschaft "SystemClass.SystemBitlockerState" ist ein Objektverweis erforderlich."

Folgender Code funktioniert.


public string? SystemBitlockerState { get; private set; }

public static string GetSystemBitlockerState()
{
    string SystemBitlockerState; // Variable deklariert
    IShellProperty prop = ShellObject.FromParsingName("C:").Properties.GetProperty("System.Volume.BitLockerProtection");
    int? bitLockerProtectionStatus = (prop as ShellProperty<int?>)?.Value;

    if (bitLockerProtectionStatus.HasValue && (bitLockerProtectionStatus == 1 || bitLockerProtectionStatus == 3 || bitLockerProtectionStatus == 5))
        SystemBitlockerState = "Aktiviert";
    else
        SystemBitlockerState = "Deaktiviert";
    return SystemBitlockerState;
}

Ich verstehe den Unterschied nicht? Warum muss ich SystemBitlockerState in dieser Methode erste deklarieren? Vor allem habe ich die Variable doch schon ganz oben (Zeile 1) deklariert?

Wenn ich beispielsweise diese Methode heranziehe, dann ist das nicht notwendig.


public string? SystemComputerName { get; private set; }

public static string GetSystemComputername()
{
    var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystem");
    using ManagementObjectCollection managementObjectCollection = searcher.Get();
    ManagementObject? managementObject = managementObjectCollection.OfType<ManagementObject>().First();
    string SystemComputerName = managementObject["Name"].ToString() ?? "Default";
    return SystemComputerName;
}

Für mich ist das verwirrend.

IDE: Visual Studio 2022
Sofern nicht anders genannt basieren meine Projekte auf C# und .net 6

4.939 Beiträge seit 2008
vor einem Jahr

Puh, das sind aber Grundlagen.
Mit


string SystemBitlockerState = "Aktiviert"; // Fehler hier

erzeugst du eine lokale Variable (mit gleichen Namen wie die Eigenschaft).
Da dies dann die einzige Anweisung in dem if- bzw. else-Block ist (denn sie ist nur in diesem Block gültig und ist danach nicht mehr zugreifbar), hat diese keine Auswirkungen und der Compiler erkennt dies als Programmierfehler an!

Und der Fehler CS0120 besagt, daß du aus statischen Methoden nicht (ohne Instanzangabe) auf nicht-statische Eigenschaften zugreifen kannst.

Mir scheint, du hast meinen letzten Beitrag doch nicht so ganz verstanden.
Bei der statischen Methode (dein 2. + 3. Code) benötigst du eben keine Eigenschaft mehr, da der Wert ja direkt als Rückgabewert zurückgegeben wird (er wird auch gar nicht benutzt, da du eben eine lokale Variable gleichen Namens erzeugt hast).

L
LittleTester Themenstarter:in
158 Beiträge seit 2019
vor einem Jahr

Danke. Das die Variablen außerhalb von if/else nicht mehr gilt war mir gar nicht mehr bewusst. Ich dachte das ist nur bei Methoden und Klassen der Fall.

Ja, das die Eigenschaften gar keinen Verweis mehr haben, habe ich heute im Geschäft gesehen. Dort hatte ich wohl mal die Funktion aktiviert um das zu sehen. Zu Hause hatte ich das noch nicht aktiviert (Jetzt schon 😄)

Ich habe mich letztlich für die Methodenvariante entschieden, einzig weil sie mir besser gefällt. Ob und in welchen praktischen Anwendungsfällen die Klasse besser geeignet ist, habe ich nicht verstanden, aber da das Programm nur Daten ermitteln und übertragen soll und anschließend beendet wird ist es wohl ohnehin egal.

IDE: Visual Studio 2022
Sofern nicht anders genannt basieren meine Projekte auf C# und .net 6