Sınıflar hakkında
Kısa açıklama
Kendi özel türlerinizi oluşturmak için sınıfları nasıl kullanabileceğinizi açıklar.
Uzun açıklama
Sürüm 5.0'dan itibaren PowerShell, sınıfları ve diğer kullanıcı tanımlı türleri tanımlamak için resmi bir sözdizimine sahiptir. Sınıfların eklenmesi, geliştiricilerin ve BT profesyonellerinin PowerShell'i daha geniş bir kullanım senaryosu için benimsemesine olanak tanır.
Sınıf bildirimi, çalışma zamanında nesnelerin örneklerini oluşturmak için kullanılan bir plandır. Bir sınıf tanımladığınızda sınıf adı türün adıdır. Örneğin, Device adlı bir sınıf bildirirseniz ve $dev değişkenini yeni bir Device örneğine başlatırsanız, $dev, Cihaz türünde bir nesne veya örnektir. Her Cihaz örneğinin özelliklerinde farklı değerler olabilir.
Desteklenen senaryolar
- Sınıflar, özellikler, yöntemler, miras vb. gibi nesne yönelimli programlama anlamlarını kullanarak PowerShell'de özel türleri tanımlayın.
- PowerShell dilini kullanarak DSC kaynaklarını ve bunlarla ilişkili türlerini tanımlayın.
- Değişkenleri, parametreleri ve özel tür tanımlarını süslemek için özel nitelikler tanımlayın.
- Tür adlarına göre yakalanabilecek özel istisnaları tanımlayın.
Sözdizimi
Tanım sözdizimi
Sınıf tanımları aşağıdaki sözdizimini kullanır:
class <class-name> [: [<base-class>][,<interface-list>]] {
[[<attribute>] [hidden] [static] <property-definition> ...]
[<class-name>([<constructor-argument-list>])
{<constructor-statement-list>} ...]
[[<attribute>] [hidden] [static] <method-definition> ...]
}
Örnekleme sözdizimi
Bir sınıfın örneğini başlatmak için aşağıdaki sözdizimlerinden birini kullanın:
[$<variable-name> =] New-Object -TypeName <class-name> [
[-ArgumentList] <constructor-argument-list>]
[$<variable-name> =] [<class-name>]::new([<constructor-argument-list>])
[$<variable-name> =] [<class-name>]@{[<class-property-hashtable>]}
Not
[ sözdizimini kullanırken, sınıf adının etrafındaki parantezlerin kullanılması zorunludur. Köşeli parantezler PowerShell için bir tür tanımına işaret eder.]::new()
Hashtable sözdizimi yalnızca herhangi bir parametre beklemeyen varsayılan bir kurucuya sahip sınıflar için çalışır. Varsayılan kurucuyla sınıfın bir örneğini oluşturur ve ardından anahtar/değer çiftlerini örnek özelliklerine atar. Hash tablosundaki herhangi bir anahtar geçerli bir özellik adı değilse PowerShell bir hata oluşturur.
Örnekler
Örnek 1 - Minimal tanım
Bu örnek, kullanılabilir bir sınıf oluşturmak için gereken minimum söz dizimini gösterir.
class Device {
[string]$Brand
}
$dev = [Device]::new()
$dev.Brand = "Fabrikam, Inc."
$dev
Brand
-----
Fabrikam, Inc.
Örnek 2 - Örnek üyelerinin bulunduğu sınıf
Bu örnek, çeşitli özelliklere, yapıcılara ve yöntemlere sahip bir Book sınıfını tanımlar. Tanımlanan her üye, statik bir üye değil, bir örnek üyedir. Özelliklere ve yöntemlere yalnızca sınıfın oluşturulmuş bir örneği aracılığıyla erişilebilir.
class Book {
# Class properties
[string] $Title
[string] $Author
[string] $Synopsis
[string] $Publisher
[datetime] $PublishDate
[int] $PageCount
[string[]] $Tags
# Default constructor
Book() { $this.Init(@{}) }
# Convenience constructor from hashtable
Book([hashtable]$Properties) { $this.Init($Properties) }
# Common constructor for title and author
Book([string]$Title, [string]$Author) {
$this.Init(@{Title = $Title; Author = $Author })
}
# Shared initializer method
[void] Init([hashtable]$Properties) {
foreach ($Property in $Properties.Keys) {
$this.$Property = $Properties.$Property
}
}
# Method to calculate reading time as 2 minutes per page
[timespan] GetReadingTime() {
if ($this.PageCount -le 0) {
throw 'Unable to determine reading time from page count.'
}
$Minutes = $this.PageCount * 2
return [timespan]::new(0, $Minutes, 0)
}
# Method to calculate how long ago a book was published
[timespan] GetPublishedAge() {
if (
$null -eq $this.PublishDate -or
$this.PublishDate -eq [datetime]::MinValue
) { throw 'PublishDate not defined' }
return (Get-Date) - $this.PublishDate
}
# Method to return a string representation of the book
[string] ToString() {
return "$($this.Title) by $($this.Author) ($($this.PublishDate.Year))"
}
}
Aşağıdaki kod parçası sınıfın bir örneğini oluşturur ve nasıl davrandığını gösterir. Book sınıfının bir örneğini oluşturduktan sonra örnek, kitap hakkında bir mesaj yazmak için GetReadingTime() ve GetPublishedAge() yöntemlerini kullanır.
$Book = [Book]::new(@{
Title = 'The Hobbit'
Author = 'J.R.R. Tolkien'
Publisher = 'George Allen & Unwin'
PublishDate = '1937-09-21'
PageCount = 310
Tags = @('Fantasy', 'Adventure')
})
$Book
$Time = $Book.GetReadingTime()
$Time = @($Time.Hours, 'hours and', $Time.Minutes, 'minutes') -join ' '
$Age = [Math]::Floor($Book.GetPublishedAge().TotalDays / 365.25)
"It takes $Time to read $Book,`nwhich was published $Age years ago."
Title : The Hobbit
Author : J.R.R. Tolkien
Synopsis :
Publisher : George Allen & Unwin
PublishDate : 9/21/1937 12:00:00 AM
PageCount : 310
Tags : {Fantasy, Adventure}
It takes 10 hours and 20 minutes to read The Hobbit by J.R.R. Tolkien (1937),
which was published 86 years ago.
Örnek 3 - Statik üyelere sahip sınıf
Bu örnekteki BookList sınıfı, örnek 2'deki Book sınıfını temel alır. BookList sınıfının kendisi statik olarak işaretlenemese de, uygulama yalnızca Kitaplar statik özelliğini ve bu özelliği yönetmek için bir dizi statik yöntemi tanımlar.
class BookList {
# Static property to hold the list of books
static [System.Collections.Generic.List[Book]] $Books
# Static method to initialize the list of books. Called in the other
# static methods to avoid needing to explicit initialize the value.
static [void] Initialize() { [BookList]::Initialize($false) }
static [bool] Initialize([bool]$force) {
if ([BookList]::Books.Count -gt 0 -and -not $force) {
return $false
}
[BookList]::Books = [System.Collections.Generic.List[Book]]::new()
return $true
}
# Ensure a book is valid for the list.
static [void] Validate([book]$Book) {
$Prefix = @(
'Book validation failed: Book must be defined with the Title,'
'Author, and PublishDate properties, but'
) -join ' '
if ($null -eq $Book) { throw "$Prefix was null" }
if ([string]::IsNullOrEmpty($Book.Title)) {
throw "$Prefix Title wasn't defined"
}
if ([string]::IsNullOrEmpty($Book.Author)) {
throw "$Prefix Author wasn't defined"
}
if ([datetime]::MinValue -eq $Book.PublishDate) {
throw "$Prefix PublishDate wasn't defined"
}
}
# Static methods to manage the list of books.
# Add a book if it's not already in the list.
static [void] Add([Book]$Book) {
[BookList]::Initialize()
[BookList]::Validate($Book)
if ([BookList]::Books.Contains($Book)) {
throw "Book '$Book' already in list"
}
$FindPredicate = {
param([Book]$b)
$b.Title -eq $Book.Title -and
$b.Author -eq $Book.Author -and
$b.PublishDate -eq $Book.PublishDate
}.GetNewClosure()
if ([BookList]::Books.Find($FindPredicate)) {
throw "Book '$Book' already in list"
}
[BookList]::Books.Add($Book)
}
# Clear the list of books.
static [void] Clear() {
[BookList]::Initialize()
[BookList]::Books.Clear()
}
# Find a specific book using a filtering scriptblock.
static [Book] Find([scriptblock]$Predicate) {
[BookList]::Initialize()
return [BookList]::Books.Find($Predicate)
}
# Find every book matching the filtering scriptblock.
static [Book[]] FindAll([scriptblock]$Predicate) {
[BookList]::Initialize()
return [BookList]::Books.FindAll($Predicate)
}
# Remove a specific book.
static [void] Remove([Book]$Book) {
[BookList]::Initialize()
[BookList]::Books.Remove($Book)
}
# Remove a book by property value.
static [void] RemoveBy([string]$Property, [string]$Value) {
[BookList]::Initialize()
$Index = [BookList]::Books.FindIndex({
param($b)
$b.$Property -eq $Value
}.GetNewClosure())
if ($Index -ge 0) {
[BookList]::Books.RemoveAt($Index)
}
}
}
Artık KitapListesi tanımlandığına göre, önceki örnekteki kitap listeye eklenebilir.
$null -eq [BookList]::Books
[BookList]::Add($Book)
[BookList]::Books
True
Title : The Hobbit
Author : J.R.R. Tolkien
Synopsis :
Publisher : George Allen & Unwin
PublishDate : 9/21/1937 12:00:00 AM
PageCount : 310
Tags : {Fantasy, Adventure}
Aşağıdaki kod parçası sınıf için statik yöntemleri çağırır.
[BookList]::Add([Book]::new(@{
Title = 'The Fellowship of the Ring'
Author = 'J.R.R. Tolkien'
Publisher = 'George Allen & Unwin'
PublishDate = '1954-07-29'
PageCount = 423
Tags = @('Fantasy', 'Adventure')
}))
[BookList]::Find({
param ($b)
$b.PublishDate -gt '1950-01-01'
}).Title
[BookList]::FindAll({
param($b)
$b.Author -match 'Tolkien'
}).Title
[BookList]::Remove($Book)
[BookList]::Books.Title
[BookList]::RemoveBy('Author', 'J.R.R. Tolkien')
"Titles: $([BookList]::Books.Title)"
[BookList]::Add($Book)
[BookList]::Add($Book)
The Fellowship of the Ring
The Hobbit
The Fellowship of the Ring
The Fellowship of the Ring
Titles:
Exception:
Line |
84 | throw "Book '$Book' already in list"
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Book 'The Hobbit by J.R.R. Tolkien (1937)' already in list
Örnek 4 - Runspace benzeşimi olan ve olmayan sınıf tanımı
[UnsafeClass]'ın ShowRunspaceId() yöntemi farklı iş parçacığı kimliklerini ancak aynı çalışma alanı kimliğini bildirir. Sonunda oturum durumu bozularak Genel kapsam kaldırılamıyor gibi bir hataya neden olur.
# Class definition with Runspace affinity (default behavior)
class UnsafeClass {
static [object] ShowRunspaceId($val) {
return [PSCustomObject]@{
ThreadId = [Threading.Thread]::CurrentThread.ManagedThreadId
RunspaceId = [runspace]::DefaultRunspace.Id
}
}
}
$unsafe = [UnsafeClass]::new()
while ($true) {
1..10 | ForEach-Object -Parallel {
Start-Sleep -ms 100
($using:unsafe)::ShowRunspaceId($_)
}
}
Not
Bu örnek sonsuz döngüde çalışmaktadır. Yürütmeyi durdurmak için Ctrl+C tuşlarına basın.
[SafeClass]'ın ShowRunspaceId() yöntemi, farklı iş parçacığı ve Runspace kimliklerini bildirir.
# Class definition with NoRunspaceAffinity attribute
[NoRunspaceAffinity()]
class SafeClass {
static [object] ShowRunspaceId($val) {
return [PSCustomObject]@{
ThreadId = [Threading.Thread]::CurrentThread.ManagedThreadId
RunspaceId = [runspace]::DefaultRunspace.Id
}
}
}
$safe = [SafeClass]::new()
while ($true) {
1..10 | ForEach-Object -Parallel {
Start-Sleep -ms 100
($using:safe)::ShowRunspaceId($_)
}
}
Not
Bu örnek sonsuz döngüde çalışmaktadır. Yürütmeyi durdurmak için Ctrl+C tuşlarına basın.
Sınıf özellikleri
Özellikler, sınıf kapsamında bildirilen değişkenlerdir. Bir özellik herhangi bir yerleşik türde veya başka bir sınıfın örneğinde olabilir. Sınıflar sıfır veya daha fazla özelliğe sahip olabilir. Sınıfların maksimum özellik sayısı yoktur.
Daha fazla bilgi için bkz. about_Classes_Properties.
Sınıf yöntemleri
Yöntemler bir sınıfın gerçekleştirebileceği eylemleri tanımlar. Yöntemler, giriş verilerini belirten parametreleri alabilir. Yöntemler her zaman bir çıktı türünü tanımlar. Bir yöntem herhangi bir çıktı döndürmüyorsa Void çıktı türüne sahip olmalıdır. Bir yöntem bir çıktı türünü açıkça tanımlamıyorsa yöntemin çıktı türü Void olur.
Daha fazla bilgi için bkz. about_Classes_Methods.
Sınıf yapıcıları
Yapıcılar, sınıfın örneğini oluştururken varsayılan değerleri ayarlamanıza ve nesne mantığını doğrulamanıza olanak tanır. Yapıcılar sınıfla aynı adı taşır. Yapıcılar, yeni nesnenin veri üyelerini başlatmak için parametrelere sahip olabilir.
Daha fazla bilgi için bkz. about_Classes_Constructors.
Gizli anahtar kelime
gizli anahtar sözcüğü bir sınıf üyesini gizler. Üye hâlâ kullanıcı tarafından erişilebilir durumdadır ve nesnenin mevcut olduğu tüm kapsamlarda mevcuttur. Gizli üyeler Get-Member cmdlet'inde gizlenir ve sınıf tanımı dışında sekme tamamlama veya IntelliSense kullanılarak görüntülenemez.
gizli anahtar sözcüğü sınıfın kendisi için değil, yalnızca sınıf üyeleri için geçerlidir.
Gizli sınıf üyeleri şunlardır:
- Sınıfın varsayılan çıktısına dahil edilmez.
Get-Membercmdlet'inin döndürdüğü sınıf üyeleri listesine dahil edilmez.Get-Memberile gizli üyeleri göstermek için Force parametresini kullanın.- Tamamlama gizli üyeyi tanımlayan sınıfta gerçekleşmediği sürece sekme tamamlamada veya IntelliSense'te görüntülenmez.
- Sınıfın genel üyeleri. Erişilebilir, devralınabilir ve değiştirilebilirler. Bir üyeyi gizlemek onu gizli yapmaz. Yalnızca önceki noktalarda açıklandığı gibi üyeyi gizler.
Not
Bir yöntem için herhangi bir aşırı yüklemeyi gizlediğinizde, bu yöntem IntelliSense'ten, tamamlama sonuçlarından ve Get-Member için varsayılan çıktıdan kaldırılır. Herhangi bir kurucuyu gizlediğinizde new() seçeneği IntelliSense ve tamamlama sonuçlarından kaldırılır.
Anahtar kelime hakkında daha fazla bilgi için bkz. about_Hidden. Gizli özellikler hakkında daha fazla bilgi için bkz. about_Classes_Properties. Gizli yöntemler hakkında daha fazla bilgi için bkz. about_Classes_Methods. Gizli oluşturucular hakkında daha fazla bilgi için bkz. about_Classes_Constructors.
Statik anahtar kelime
static anahtar sözcüğü, sınıfta bulunan ve örneğe ihtiyaç duymayan bir özelliği veya yöntemi tanımlar.
Statik bir özellik, sınıf örneğinden bağımsız olarak her zaman kullanılabilir. Statik bir özellik sınıfın tüm örnekleri arasında paylaşılır. Her zaman statik bir yöntem mevcuttur. Tüm statik özellikler, tüm oturum süresi boyunca geçerlidir.
static anahtar sözcüğü sınıfın kendisi için değil, yalnızca sınıf üyeleri için geçerlidir.
Statik özellikler hakkında daha fazla bilgi için bkz. about_Classes_Properties. Statik yöntemler hakkında daha fazla bilgi için bkz. about_Classes_Methods. Statik oluşturucular hakkında daha fazla bilgi için bkz. about_Classes_Constructors.
PowerShell sınıflarında miras
Mevcut bir sınıftan türetilen yeni bir sınıf oluşturarak bir sınıfı genişletebilirsiniz. Türetilmiş sınıf, temel sınıfın özelliklerini ve yöntemlerini miras alır. Temel sınıf üyelerini gerektiği gibi ekleyebilir veya geçersiz kılabilirsiniz.
PowerShell çoklu devralmayı desteklemez. Sınıflar birden fazla sınıftan doğrudan miras alamaz.
Sınıflar ayrıca bir sözleşmeyi tanımlayan arayüzlerden de miras alabilir. Bir arayüzden miras alan bir sınıfın bu sözleşmeyi uygulaması gerekir. Bunu yaptığında sınıf, bu arayüzü uygulayan diğer sınıflar gibi kullanılabilir.
Bir temel sınıftan veya uygulama arayüzlerinden miras alan sınıfların türetilmesi hakkında daha fazla bilgi için bkz. about_Classes_Inheritance.
NoRunspaceAffinity özelliği
Çalışma alanı, PowerShell tarafından çağrılan komutların işletim ortamıdır. Bu ortam, halihazırda mevcut olan komutları ve verileri ve halihazırda geçerli olan tüm dil kısıtlamalarını içerir.
Varsayılan olarak bir PowerShell sınıfı, oluşturulduğu Runspace'e bağlıdır. ForEach-Object -Parallel'da PowerShell sınıfının kullanılması güvenli değildir. Sınıftaki yöntem çağrıları, oluşturulduğu Runspace'e geri gönderilir; bu, Runspace'in durumunu bozabilir veya kilitlenmeye neden olabilir.
NoRunspaceAffinity niteliğinin sınıf tanımına eklenmesi, PowerShell sınıfının belirli bir çalışma alanına bağlı olmamasını sağlar. Hem örnek hem de statik yöntem çağrıları, çalışan iş parçacığının Çalışma alanını ve iş parçacığının geçerli oturum durumunu kullanır.
Bu özellik PowerShell 7.4'e eklendi.
NoRunspaceAffinity özniteliğine sahip olan ve olmayan sınıfların davranış farklılıklarının bir örneği için Örnek 4'e bakın.
Sınıfları tür hızlandırıcılarla dışa aktarma
Varsayılan olarak PowerShell modülleri, PowerShell'de tanımlanan sınıfları ve numaralandırmaları otomatik olarak dışarı aktarmaz. Özel türler, using module ifadesi çağrılmadan modülün dışında kullanılamaz.
Bununla birlikte, bir modül tür hızlandırıcılar eklerse bu tür hızlandırıcılar, kullanıcılar modülü içe aktardıktan sonra oturumda hemen kullanılabilir hale gelir.
Not
Oturuma tür hızlandırıcıların eklenmesi dahili (genel olmayan) bir API kullanır. Bu API'nin kullanılması çakışmalara neden olabilir. Aşağıda açıklanan model, modülü içe aktardığınızda aynı ada sahip bir tür hızlandırıcının zaten mevcut olması durumunda bir hata atar. Ayrıca modülü oturumdan kaldırdığınızda tür hızlandırıcıları da kaldırır.
Bu kalıp, türlerin bir oturumda kullanılabilir olmasını sağlar. VS Code'da bir komut dosyası yazarken IntelliSense'i veya tamamlamayı etkilemez. VS Code'daki özel türlere yönelik IntelliSense ve tamamlama önerileri almak için betiğin üst kısmına bir using module ifadesi eklemeniz gerekir.
Aşağıdaki model, PowerShell sınıflarını ve numaralandırmalarını bir modülde tür hızlandırıcılar olarak nasıl kaydedebileceğinizi gösterir. Herhangi bir tür tanımından sonra pasajı kök komut dosyası modülüne ekleyin. $ExportableTypes değişkeninin, modülü içe aktardıklarında kullanıcıların kullanımına sunmak istediğiniz türlerin her birini içerdiğinden emin olun. Diğer kod herhangi bir düzenleme gerektirmez.
# Define the types to export with type accelerators.
$ExportableTypes =@(
[DefinedTypeName]
)
# Get the internal TypeAccelerators class to use its static methods.
$TypeAcceleratorsClass = [psobject].Assembly.GetType(
'System.Management.Automation.TypeAccelerators'
)
# Ensure none of the types would clobber an existing type accelerator.
# If a type accelerator with the same name exists, throw an exception.
$ExistingTypeAccelerators = $TypeAcceleratorsClass::Get
foreach ($Type in $ExportableTypes) {
if ($Type.FullName -in $ExistingTypeAccelerators.Keys) {
$Message = @(
"Unable to register type accelerator '$($Type.FullName)'"
'Accelerator already exists.'
) -join ' - '
throw [System.Management.Automation.ErrorRecord]::new(
[System.InvalidOperationException]::new($Message),
'TypeAcceleratorAlreadyExists',
[System.Management.Automation.ErrorCategory]::InvalidOperation,
$Type.FullName
)
}
}
# Add type accelerators for every exportable type.
foreach ($Type in $ExportableTypes) {
$TypeAcceleratorsClass::Add($Type.FullName, $Type)
}
# Remove type accelerators when the module is removed.
$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = {
foreach($Type in $ExportableTypes) {
$TypeAcceleratorsClass::Remove($Type.FullName)
}
}.GetNewClosure()
Kullanıcılar modülü içe aktardıklarında, oturum için tür hızlandırıcılara eklenen tüm türler IntelliSense için hemen kullanılabilir ve tamamlanır. Modül kaldırıldığında tip hızlandırıcılar da kaldırılır.
PowerShell modülünden sınıfları manuel olarak içe aktarma
Import-Module ve #requires ifadesi yalnızca modül tarafından tanımlandığı şekilde modül işlevlerini, takma adlarını ve değişkenleri içe aktarır. Sınıflar içe aktarılmaz.
Bir modül sınıfları ve numaralandırmaları tanımlıyor ancak bu türler için tür hızlandırıcıları eklemiyorsa, bunları içe aktarmak için bir using module deyimi kullanın.
using module ifadesi, bir komut dosyası modülünün veya ikili modülün kök modülünden (ModuleToProcess) sınıfları ve numaralandırmaları içe aktarır. Yuvalanmış modüllerde tanımlanan sınıfları veya nokta kaynaklı komut dosyalarında tanımlanan sınıfları kök modüle tutarlı bir şekilde içe aktarmaz. Modül dışındaki kullanıcıların kullanımına sunulmasını istediğiniz sınıfları doğrudan kök modülde tanımlayın.
using ifadesi hakkında daha fazla bilgi için bkz. about_Using.
Geliştirme sırasında yeni değiştirilen kod yükleniyor
Bir komut dosyası modülünün geliştirilmesi sırasında, kodda değişiklik yapmak ve ardından Import-Module ile Force parametresini kullanarak modülün yeni sürümünü yüklemek yaygın bir uygulamadır. Modülün yeniden yüklenmesi yalnızca kök modüldeki işlevlerde yapılan değişikliklerde işe yarar. Import-Module iç içe geçmiş modülleri yeniden yüklemez. Ayrıca güncellenmiş sınıfları yüklemenin bir yolu yoktur.
En son sürümü çalıştırdığınızdan emin olmak için yeni bir oturum başlatmalısınız. PowerShell'de tanımlanan ve using ifadesiyle içe aktarılan sınıflar ve numaralandırmalar kaldırılamaz.
Bir diğer yaygın geliştirme uygulaması da kodunuzu farklı dosyalara ayırmaktır. Bir dosyada, başka bir modülde tanımlanan sınıfları kullanan bir işlev varsa, işlevlerin ihtiyaç duyulan sınıf tanımlarına sahip olduğundan emin olmak için using module ifadesini kullanmalısınız.
PSReference türü sınıf üyeleriyle desteklenmiyor
[ref] türü hızlandırıcı, PSReference sınıfının kısaltmasıdır. Bir sınıf üyesine tür dönüşümü yapmak için [ref] kullanılması sessizce başarısız olur. [ref] parametrelerini kullanan API'ler sınıf üyeleriyle kullanılamaz. PSReference sınıfı COM nesnelerini destekleyecek şekilde tasarlanmıştır. COM nesnelerinde referans olarak bir değer iletmeniz gereken durumlar vardır.
Daha fazla bilgi için bkz. PSReference Sınıfı.
Sınırlamalar
Aşağıdaki listeler, PowerShell sınıflarını tanımlamaya yönelik sınırlamaları ve varsa bu sınırlamalara yönelik geçici çözümleri içerir.
Genel sınırlamalar
Sınıf üyeleri PSReference'ı tür olarak kullanamaz.
Geçici Çözüm: Yok.
PowerShell sınıfları bir oturumda kaldırılamaz veya yeniden yüklenemez.
Geçici Çözüm: Yeni bir oturum başlatın.
Bir modülde tanımlanan PowerShell sınıfları otomatik olarak içe aktarılmaz.
Geçici çözüm: Tanımlanan türleri, kök modüldeki tür hızlandırıcılar listesine ekleyin. Bu, türleri modül içe aktarma sırasında kullanılabilir hale getirir.
gizlivestatikanahtar sözcükleri yalnızca sınıf üyelerine uygulanır, sınıf tanımına uygulanmaz.Geçici Çözüm: Yok.
Varsayılan olarak PowerShell sınıflarının çalışma alanları arasında paralel yürütmede kullanılması güvenli değildir. Bir sınıfta yöntemleri çağırdığınızda, PowerShell çağrıları sınıfın oluşturulduğu Runspace'e yönlendirir; bu da Runspace'in durumunu bozabilir veya kilitlenmeye neden olabilir.
Geçici Çözüm:
NoRunspaceAffinityniteliğini sınıf bildirimine ekleyin.
Yapıcı sınırlamaları
Yapıcı zincirleme uygulanmadı.
Geçici Çözüm: Gizli
Init()yöntemlerini tanımlayın ve bunları yapıcıların içinden çağırın.Yapıcı parametreleri, doğrulama nitelikleri de dahil olmak üzere hiçbir özelliği kullanamaz.
Geçici Çözüm: Yapıcı gövdesindeki parametreleri doğrulama özelliğiyle yeniden atayın.
Yapıcı parametreleri varsayılan değerleri tanımlayamaz. Parametreler her zaman zorunludur.
Geçici Çözüm: Yok.
Bir yapıcının herhangi bir aşırı yüklemesi gizlenmişse, yapıcının her aşırı yüklemesi de gizli olarak ele alınır.
Geçici Çözüm: Yok.
Yöntem sınırlamaları
Yöntem parametreleri, doğrulama öznitelikleri de dahil olmak üzere hiçbir özniteliği kullanamaz.
Geçici çözüm: Yöntem gövdesindeki parametreleri doğrulama özniteliğiyle yeniden atayın veya yöntemi statik oluşturucuda
Update-TypeDatacmdlet'iyle tanımlayın.Yöntem parametreleri varsayılan değerleri tanımlayamaz. Parametreler her zaman zorunludur.
Geçici Çözüm: Statik oluşturucudaki yöntemi
Update-TypeDatacmdlet'iyle tanımlayın.Yöntemler gizli olsalar bile her zaman herkese açıktır. Sınıf devralındığında geçersiz kılınabilirler.
Geçici Çözüm: Yok.
Bir yöntemin herhangi bir aşırı yüklemesi gizlenmişse, o yönteme ilişkin her aşırı yükleme de gizli olarak değerlendirilir.
Geçici Çözüm: Yok.
Mülkiyet sınırlamaları
Statik özellikler her zaman değiştirilebilir. PowerShell sınıfları değişmez statik özellikleri tanımlayamaz.
Geçici Çözüm: Yok.
Sınıf özelliği öznitelik bağımsız değişkenlerinin sabit olması gerektiğinden, özellikler ValidateScript özniteliğini kullanamaz.
Geçici Çözüm: ValidateArgumentsAttribute türünden miras alan bir sınıf tanımlayın ve onun yerine bu özelliği kullanın.
Doğrudan bildirilen özellikler, özel alıcı ve ayarlayıcı uygulamalarını tanımlayamaz.
Geçici Çözüm: Gizli bir özellik tanımlayın ve görünür alıcı ve ayarlayıcı mantığını tanımlamak için
Update-TypeData'ı kullanın.Mülkler Takma Ad özelliğini kullanamaz. Öznitelik yalnızca parametreler, cmdlet'ler ve işlevler için geçerlidir.
Geçici Çözüm: Sınıf oluşturucularındaki takma adları tanımlamak için
Update-TypeDatacmdlet'ini kullanın.Bir PowerShell sınıfı
ConvertTo-Jsoncmdlet'i ile JSON'a dönüştürüldüğünde, JSON çıkışı tüm gizli özellikleri ve bunların değerlerini içerir.Geçici Çözüm: Yok
Miras sınırlamaları
PowerShell, komut dosyası kodunda arabirimlerin tanımlanmasını desteklemez.
Geçici çözüm: C#'ta arayüzleri tanımlayın ve arayüzleri tanımlayan derlemeye başvurun.
PowerShell sınıfları yalnızca bir temel sınıftan miras alabilir.
Geçici Çözüm: Sınıf mirası geçişlidir. Türetilmiş bir sınıf, bir temel sınıfın özelliklerini ve yöntemlerini elde etmek için başka bir türetilmiş sınıftan miras alabilir.
Genel bir sınıftan veya arayüzden miras alırken, genelin type parametresi önceden tanımlanmış olmalıdır. Bir sınıf kendisini bir sınıfın veya arayüzün tür parametresi olarak tanımlayamaz.
Geçici çözüm: Genel bir temel sınıftan veya arayüzden türetmek için, özel türü farklı bir
.psm1dosyasında tanımlayın ve türü yüklemek içinusing moduledeyimini kullanın. Özel bir türün, bir jenerikten devralınırken kendisini tür parametresi olarak kullanmasına yönelik bir geçici çözüm yoktur.
Ayrıca bakınız
- about_Classes_Constructors
- about_Classes_Inheritance
- about_Classes_Methods
- about_Classes_Properties
- about_Enum
- about_Gizli
- about_Language_Keywords
- about_Methods
- about_Using