about_Classes

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 başlayarak, PowerShell'in sınıfları ve diğer kullanıcı tanımlı türleri tanımlamak için resmi bir söz dizimi vardır. Sınıfların eklenmesi, geliştiricilerin ve BT uzmanlarının daha geniş bir kullanım örneği yelpazesi için PowerShell'i benimsemesini sağlar.

Sınıf bildirimi, çalışma zamanında nesne örnekleri oluşturmak için kullanılan bir şemadı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 bildirir ve yeni bir Device örneğine bir değişken $dev başlatırsanız, $dev Device türünde bir nesne veya örnektir. Cihaz'ın her örneğinin özelliklerinde farklı değerler olabilir.

Desteklenen senaryolar

  • Sınıflar, özellikler, yöntemler, devralma gibi nesne odaklı programlama semantiği kullanarak PowerShell'de özel türler tanımlayın.
  • PowerShell dilini kullanarak DSC kaynaklarını ve ilişkili türlerini tanımlayın.
  • Değişkenleri, parametreleri ve özel tür tanımlarını süslemek için özel öznitelikler tanımlayın.
  • Tür adlarına göre yakalanabilecek özel özel durumlar tanımlayın.

Sözdizimi

Tanım söz dizimi

Sınıf tanımları aşağıdaki söz dizimini 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> ...]
}

Örnek oluşturma söz dizimi

Bir sınıfın örneğini oluşturmak için aşağıdaki söz dizimlerinden 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öz dizimi kullanılırken [<class-name>]::new() , sınıf adının etrafındaki köşeli ayraçlar zorunlu olur. Köşeli ayraçlar PowerShell için bir tür tanımı sinyali verir.

Karma tablo söz dizimi yalnızca parametre beklemeyen varsayılan bir oluşturucuya sahip sınıflar için çalışır. Varsayılan oluşturucu ile sınıfının bir örneğini oluşturur ve ardından anahtar-değer çiftlerini örnek özelliklerine atar. Karma tablodaki herhangi bir anahtar geçerli bir özellik adı değilse PowerShell bir hata oluşturur.

Örnekler

Örnek 1 - Minimum tanım

Bu örnekte, kullanılabilir bir sınıf oluşturmak için gereken en düşük söz dizimi gösterilmektedir.

class Device {
    [string]$Brand
}

$dev = [Device]::new()
$dev.Brand = "Fabrikam, Inc."
$dev
Brand
-----
Fabrikam, Inc.

Örnek 2 - Örnek üyeleriyle sınıf

Bu örnek çeşitli özelliklere, oluşturuculara ve yöntemlere sahip bir Book sınıfını tanımlar. Tanımlanan her üye bir örnek üyesidir, statik üye değildir. Ö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çacığı 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 ileti yazmak için ve GetPublishedAge() yöntemlerini kullanırGetReadingTime().

$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 üyeleri olan sınıf

Bu örnekteki BookList sınıfı, örnek 2'de Book sınıfını oluşturur. BookList sınıfı statik olarak işaretlenemez ancak uygulama yalnızca Books 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)
        }
    }
}

BookList 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çacığı, 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 - Bir çalışma alanının bozulmasına neden olan paralel yürütme

ShowRunspaceId() yöntemi [UnsafeClass] farklı iş parçacığı kimliklerini ancak aynı çalışma alanı kimliğini bildirir. Sonunda, oturum durumu bozuktur ve gibi Global scope cannot be removedbir 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 bir döngüde çalışır. Yürütmeyi durdurmak için Ctrl+C girin.

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 bir örneğinde olabilir. Sınıflar sıfır veya daha fazla özelliğe sahip olabilir. Sınıfların özellik sayısı üst sınırı yoktur.

Daha fazla bilgi için bkz . about_Classes_Properties.

Sınıf yöntemleri

Yöntemler, bir sınıfın gerçekleştirebildiği eylemleri tanımlar. Yöntemler, giriş verilerini belirten parametreleri alabilir. Yöntemler her zaman bir çıkış türü tanımlar. Bir yöntem herhangi bir çıkış döndürmezse Void çıkış türüne sahip olmalıdır. Bir yöntem açıkça bir çıkış türü tanımlamazsa, yöntemin çıkış türü Void olur.

Daha fazla bilgi için bkz . about_Classes_Methods.

Sınıf oluşturucuları

Oluşturucular, sınıfın örneğini oluştururken varsayılan değerleri ayarlamanıza ve nesne mantığını doğrulamanıza olanak tanır. Oluşturucular sınıfıyla aynı ada sahiptir. Oluşturucuların, yeni nesnenin veri üyelerini başlatmak için parametreleri olabilir.

Daha fazla bilgi için bkz . about_Classes_Constructors.

Gizli anahtar sözcük

anahtar hidden sözcüğü bir sınıf üyesini gizler. Üye hala kullanıcı tarafından erişilebilir durumdadır ve nesnenin kullanılabilir olduğu tüm kapsamlarda kullanılabilir. Gizli üyeler cmdlet'inden gizlenir Get-Member ve sınıf tanımının dışında sekme tamamlama veya IntelliSense kullanılarak görüntülenemez.

anahtar hidden sözcüğü yalnızca sınıf üyeleri için geçerlidir, sınıfın kendisi için geçerli değildir.

Gizli sınıf üyeleri şunlardır:

  • Sınıfın varsayılan çıkışına dahil değildir.
  • cmdlet'i tarafından Get-Member döndürülen sınıf üyeleri listesine dahil değildir. ile Get-Membergizli üyeleri göstermek için Force parametresini kullanın.
  • Gizli üyeyi tanımlayan sınıfta tamamlanma gerçekleşmediği sürece sekme tamamlama veya IntelliSense'te görüntülenmez.
  • Sınıfın genel üyeleri. Bunlara erişilebilir, devralınabilir ve değiştirilebilir. Bir üyenin gizlenmesi onu özel yapmaz. Yalnızca önceki noktalarda açıklandığı gibi üyeyi gizler.

Not

Bir yöntemin aşırı yüklemesini gizlediğinizde, bu yöntem IntelliSense'ten, tamamlanma sonuçlarından ve için Get-Membervarsayılan çıktıdan kaldırılır. Herhangi bir oluşturucuyu gizlediğinizde, new() seçenek IntelliSense ve tamamlama sonuçlarından kaldırılır.

Anahtar sözcük 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 sözcük

static anahtar sözcüğü, sınıfında var olan ve örneği olmayan bir özellik veya yöntem tanımlar.

Statik bir özellik, sınıf örneğinden bağımsız olarak her zaman kullanılabilir. Statik özellik, sınıfın tüm örnekleri arasında paylaşılır. Statik bir yöntem her zaman kullanılabilir. Tüm statik özellikler tüm oturum süresi boyunca etkindir.

anahtar static sözcüğü yalnızca sınıf üyeleri için geçerlidir, sınıfın kendisi için geçerli değildir.

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 devralma

Varolan 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 devralır. Temel sınıf üyelerini gerektiği gibi ekleyebilir veya geçersiz kılabilirsiniz.

PowerShell birden çok devralmayı desteklemez. Sınıflar doğrudan birden fazla sınıftan devralamaz.

Sınıflar, bir sözleşme tanımlayan arabirimlerden de devralabilir. Bir arabirimden devralan bir sınıfın bu sözleşmeyi uygulaması gerekir. Bunu yaptığı zaman sınıfı, bu arabirimi uygulayan diğer tüm sınıflar gibi kullanılabilir.

Temel sınıftan devralan veya arabirimler uygulayan sınıfları türetme hakkında daha fazla bilgi için bkz . about_Classes_Inheritance.

Runspace benzinim

Çalışma alanı, PowerShell tarafından çağrılan komutların işletim ortamıdır. Bu ortam, şu anda mevcut olan komutları ve verileri ve geçerli olan tüm dil kısıtlamalarını içerir.

PowerShell sınıfı, oluşturulduğu Runspace ile ilişkilidir. içinde ForEach-Object -Parallel PowerShell sınıfı kullanmak güvenli değildir. Sınıfındaki yöntem çağrıları, oluşturulduğu Runspace'e geri sıralanır ve bu durum Runspace'in durumunu bozabilir veya kilitlenmeye neden olabilir.

Çalışma alanı benziminin hatalara nasıl neden olabileceğini gösteren bir çizim için bkz . Örnek 4.

Tür hızlandırıcıları ile sınıfları dışarı 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, deyimi using module çağrılmadan modülün dışında kullanılamaz.

Ancak, bir modül tür hızlandırıcıları eklerse, kullanıcılar modülü içeri aktardıktan sonra bu tür hızlandırıcıları oturumda hemen kullanılabilir.

Not

Oturuma tür hızlandırıcıları eklemek için iç (genel değil) API kullanılır. Bu API'nin kullanılması çakışmalara neden olabilir. Aşağıda açıklanan desen, modülü içeri aktardığınızda aynı ada sahip bir tür hızlandırıcısı zaten varsa hata oluşturur. Ayrıca modülü oturumdan kaldırdığınızda tür hızlandırıcılarını da kaldırır.

Bu düzen, türlerin bir oturumda kullanılabilir olmasını sağlar. VS Code'da bir betik dosyası yazılırken IntelliSense'i veya tamamlanmayı etkilemez. VS Code'daki özel türler için IntelliSense ve tamamlama önerileri almak için betiğin en üstüne bir using module deyim eklemeniz gerekir.

Aşağıdaki desen, 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. Kod parçacığını herhangi bir tür tanımından sonra kök betik modülüne ekleyin. Değişkenin $ExportableTypes , modülü içeri aktardığında kullanıcıların kullanımına açmak 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çeri aktardığında, oturum için tür hızlandırıcılarına eklenen tüm türler IntelliSense ve tamamlama için hemen kullanılabilir. Modül kaldırıldığında tür hızlandırıcıları da kaldırılır.

PowerShell modülünden sınıfları el ile içeri aktarma

Import-Module#requires ve deyimi yalnızca modül tarafından tanımlandığı gibi modül işlevlerini, diğer adlarını ve değişkenlerini içeri aktarır. Sınıflar içeri aktarılamaz.

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çeri aktarmak için deyimini using module kullanın.

deyimi, using module bir betik modülünün veya ikili modülün kök modülünden (ModuleToProcess) sınıfları ve numaralandırmaları içeri aktarır. İç içe modüllerde tanımlanan sınıfları veya kök modüle nokta kaynaklı betiklerde tanımlanan sınıfları tutarlı bir şekilde içeri aktarmaz. Doğrudan kök modülde modülün dışındaki kullanıcıların kullanımına sunulmasını istediğiniz sınıfları tanımlayın.

Deyimi hakkında using daha fazla bilgi için bkz . about_Using.

Geliştirme sırasında yeni değiştirilen kodu yükleme

Bir betik modülünün geliştirilmesi sırasında kodda değişiklik yapmak ve ardından Force parametresini kullanarak Import-Module modülün yeni sürümünü yüklemek yaygın bir işlemdir. Modülü yeniden yüklemek yalnızca kök modüldeki işlevlerde yapılan değişiklikler için çalışır. Import-Module iç içe modülleri yeniden yüklemez. Ayrıca, güncelleştirilmiş sınıfları yüklemenin hiçbir yolu yoktur.

En son sürümü çalıştırdığınızdan emin olmak için yeni bir oturum başlatmanız gerekir. PowerShell'de tanımlanan ve bir using deyimle içeri 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. Başka bir modülde tanımlanan sınıfları kullanan bir dosyada işleviniz varsa, işlevlerin using module gerekli sınıf tanımlarına sahip olduğundan emin olmak için deyimini kullanmanız gerekir.

PSReference türü sınıf üyeleriyle desteklenmez

Tür [ref] hızlandırıcısı PSReference sınıfı için kısaltmadır. Sınıf üyesini tür atama için kullanma [ref] sessizce başarısız olur. Parametre kullanan [ref] API'ler sınıf üyeleriyle kullanılamaz. PSReference sınıfı, COM nesnelerini destekleyecek şekilde tasarlanmıştır. COM nesneleri, başvuruya göre bir değer geçirmeniz gereken durumlara sahiptir.

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ırlamalar için geçici çözümü içerir.

Genel sınırlamalar

  • Sınıf üyeleri, türü olarak PSReference 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.

  • Modülde tanımlanan PowerShell sınıfları otomatik olarak içeri aktarılamaz.

    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çeri aktarma işleminde kullanılabilir hale getirir.

  • hidden ve static anahtar sözcükleri yalnızca sınıf üyelerine uygulanır, sınıf tanımına uygulanmaz.

    Geçici çözüm: Yok.

  • 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 geri sıralar; bu durum Runspace'in durumunu bozabilir veya kilitlenmeye neden olabilir.

    Geçici çözüm: Yok.

Oluşturucu sınırlamaları

  • Oluşturucu zincirleme uygulanmaz.

    Geçici çözüm: Gizli Init() yöntemleri tanımlayın ve oluşturucuların içinden çağırın.

  • Oluşturucu parametreleri doğrulama öznitelikleri de dahil olmak üzere herhangi bir özniteliği kullanamaz.

    Geçici çözüm: Oluşturucu gövdesindeki parametreleri doğrulama özniteliğiyle yeniden atayın.

  • Oluşturucu parametreleri varsayılan değerleri tanımlayamaz. Parametreler her zaman zorunlu olmalıdır.

    Geçici çözüm: Yok.

  • Bir oluşturucunun herhangi bir aşırı yüklemesi gizliyse, oluşturucu için her aşırı yükleme de gizli olarak değerlendirilir.

    Geçici çözüm: Yok.

Yöntem sınırlamaları

  • Yöntem parametreleri doğrulama öznitelikleri de dahil olmak üzere herhangi bir özniteliği kullanamaz.

    Geçici çözüm: Yöntem gövdesindeki parametreleri doğrulama özniteliğiyle yeniden atayın veya cmdlet'iyle Update-TypeData statik oluşturucuda yöntemini tanımlayın.

  • Yöntem parametreleri varsayılan değerleri tanımlayamaz. Parametreler her zaman zorunlu olmalıdır.

    Geçici çözüm: cmdlet'iyle statik oluşturucuda Update-TypeData yöntemini tanımlayın.

  • Yöntemler gizli olsalar bile her zaman geneldir. Sınıf devralındığında bunlar geçersiz kılınabilir.

    Geçici çözüm: Yok.

  • Bir yöntemin herhangi bir aşırı yüklemesi gizlenirse, bu yöntemin her aşırı yüklemesi de gizli olarak değerlendirilir.

    Geçici çözüm: Yok.

Özellik sınırlamaları

  • Statik özellikler her zaman değişebilir. PowerShell sınıfları sabit 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 devralan bir sınıf tanımlayın ve bunun yerine bu özniteliği kullanın.

  • Doğrudan bildirilen özellikler özel alıcı ve ayarlayıcı uygulamaları 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 kullanın Update-TypeData .

  • Özellikler Diğer Ad özniteliğini kullanamaz. özniteliği yalnızca parametreler, cmdlet'ler ve işlevler için geçerlidir.

    Geçici çözüm: Sınıf oluşturucularında diğer adları tanımlamak için cmdlet'ini kullanın Update-TypeData .

  • Bir PowerShell sınıfı cmdlet'i ile ConvertTo-Json JSON'a dönüştürüldüğünde, çıkış JSON'ı tüm gizli özellikleri ve değerlerini içerir.

    Geçici çözüm: Yok

Devralma sınırlamaları

  • PowerShell, betik kodunda arabirim tanımlamayı desteklemez.

    Geçici çözüm: C# dilinde arabirimleri tanımlayın ve arabirimleri tanımlayan derlemeye başvurun.

  • PowerShell sınıfları yalnızca bir temel sınıftan devralabilir.

    Geçici çözüm: Sınıf devralma geçişli. Türetilmiş bir sınıf, temel sınıfın özelliklerini ve yöntemlerini almak için başka bir türetilmiş sınıftan devralabilir.

  • Genel bir sınıftan veya arabirimden devralırken, genel için tür parametresinin zaten tanımlanmış olması gerekir. Sınıf kendisini bir sınıf veya arabirim için tür parametresi olarak tanımlayamaz.

    Geçici çözüm: Genel bir temel sınıftan veya arabirimden türetmek için özel türü farklı .psm1 bir dosyada tanımlayın ve türünü yüklemek için deyimini using module kullanın. Bir özel türün genel bir türden devralırken tür parametresi olarak kendisini kullanması için geçici bir çözüm yoktur.

Ayrıca bkz.