emeriks
Goto Top

PowerShell - Statische Variablen innerhalb von Methoden

Moin,
ich suche ein Äquivalent zu einem VB.Net Code in PowerShell.

In VB.Net kann man eine Variable innerhalb einer Methode als "Static" deklarieren, was dafür sorgt, dass diese Variable beim nächsten Aufruf dieser Methode den selben Wert hat, wie beim letzten Aufruf davor.

Beispiel:
Class KlasseA
  Public Function GetNextValue()
    Static Var1 as Integer = 0
    Var1 += 1
    Return Var1
  End Function
End Class

Wie kann man das in PowerShell abbilden, ohne diese Variable außerhalb der Methode gleich für die ganze Klasse zu deklarieren?

Das hier z.B. funktioniert nicht.
Class KlasseA {
  [int] GetNextValue() {
    [int] static $Var1 = 0
    $Var1 += 1
    Return $Var1
  }
}

Alternativ:
Kann man in PowerShell Class Member als "Private" deklarieren? Dann könnte ich o.g. so umsetzen, dass ich diese Variable außerhalb der Methode deklariere, womit sie für alle Methoden quasi "Static" ist.
Allerdings will ich verhindern, dass man diese Variable von außerhalb der Klasseninstanz ändern kann. Dafür habe ich schon recherchiert, dass man Member mit "hidden" "verstecken" kann, was dafür sorgen würde, dass diese bei "Get-Member" nicht aufgeführt würden. Allerdings kann man "hidden properties" dann trotzdem noch ändern.

Ich will damit nicht erreichen, dass ich Dritten vorschreiben kann, wie sie die Klasse zu verwenden haben, sondern dass ich selbst beim Verwenden der Klasse nicht aus Versehen diese Variable von außerhalb der Instanz verändere. Also einfach nur Programmierfehler vermeiden.

E.

Content-ID: 3658028254

Url: https://administrator.de/contentid/3658028254

Ausgedruckt am: 18.12.2024 um 18:12 Uhr

13676056485
Lösung 13676056485 01.07.2024 aktualisiert um 09:44:59 Uhr
Goto Top
Man nehme Add-Type schon hast du alles was du mit c# oder VB.net machen kannst
Add-Type @'  
using System;
public class KlasseA {
  private int var1 = 0;
  public int GetNextValue() {
    var1++;
    return var1;
  }
}
'@  
$cls = [KlasseA]::New()
$cls.GetNextValue()
$cls.GetNextValue()
Gruß
emeriks
emeriks 01.07.2024 um 09:59:17 Uhr
Goto Top
Danke.
Sowas hatte ich auch schon gelesen. Nachteil davon ist aber, dass ich dann die gesamte Klasse in C# oder VB.Net schreiben müsste.
13676056485
Lösung 13676056485 01.07.2024 aktualisiert um 10:23:39 Uhr
Goto Top
Zitat von @emeriks:
Nachteil davon ist aber, dass ich dann die gesamte Klasse in C# oder VB.Net schreiben müsste.
Nicht zwingend, mit Add-Member kannst du problemlos weitere Member und Methoden / Sriptblocks mittels Powershell-Code und Mittel hinzufügen.
# ....
$cls = [KlasseA]::New()
$cls | Add-Member -MemberType ScriptMethod -Name MyMethod -Value {
    write-host "Hallo"  
}
$cls.MyMethod()

Powershell Class Limitations
Static properties are always mutable. PowerShell classes can't define immutable static properties.
Workaround: None.
emeriks
emeriks 01.07.2024 um 10:31:44 Uhr
Goto Top
Aber das müste ich dann für jede neue Instanz machen?
Dann müsste ich ne Sub bauen wie "Get-NewKlasseA" o.ä.
13676056485
Lösung 13676056485 01.07.2024 aktualisiert um 10:33:14 Uhr
Goto Top
Zitat von @emeriks:

Aber das müste ich dann für jede neue Instanz machen?
Nein, mit Update-TypeData kann man das allen Instanzen automatisch hinzufügen.
emeriks
emeriks 01.07.2024 um 10:34:44 Uhr
Goto Top
Danke!
Dann habe ich ja jetzt was zu tun. face-smile
13676056485
13676056485 01.07.2024 aktualisiert um 10:37:57 Uhr
Goto Top
Kurzes Beispiel:
Add-Type @'    
using System;
public class KlasseA {
  private int var1 = 0;
  public int GetNextValue() {
    var1++;
    return var1;
  }
}
'@    

Update-TypeData -TypeName KlasseA -MemberType ScriptMethod -MemberName MyMethod -Value {
    write-host "Hallo"  
}

$cls = [KlasseA]::New()
$cls.MyMethod()
$cls2 = [KlasseA]::New()
$cls2.MyMethod()
Alle neuen Instanzen der Klasse erben automatisch die hinzugefügten Member.