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:
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.
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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3658028254
Url: https://administrator.de/contentid/3658028254
Ausgedruckt am: 18.11.2024 um 13:11 Uhr
7 Kommentare
Neuester Kommentar
Man nehme Add-Type schon hast du alles was du mit c# oder VB.net machen kannst
Gruß
Add-Type @'
using System;
public class KlasseA {
private int var1 = 0;
public int GetNextValue() {
var1++;
return var1;
}
}
'@
$cls = [KlasseA]::New()
$cls.GetNextValue()
$cls.GetNextValue()
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.Nachteil davon ist aber, dass ich dann die gesamte Klasse in C# oder VB.Net schreiben müsste.
# ....
$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.
Workaround: None.
Nein, mit Update-TypeData kann man das allen Instanzen automatisch hinzufügen.
Kurzes Beispiel:
Alle neuen Instanzen der Klasse erben automatisch die hinzugefügten Member.
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()