Sınıf Özellikleri hakkında


Kısa açıklama

PowerShell sınıflarının özelliklerinin nasıl tanımlanacağını açıklar.

Uzun açıklama

Özellikler veri içeren sınıfın üyeleridir. Özellikler sınıf kapsamında değişkenler olarak bildirilir. 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ği sıfırlayabilir. Sınıfların maksimum özellik sayısı yoktur.

Sınıf özellikleri, gizli ve statik özellikler de dahil olmak üzere herhangi bir sayıda özelliğe sahip olabilir. Her özellik tanımı, özellik için bir tür içermelidir. Bir özellik için varsayılan bir değer tanımlayabilirsiniz.

Sözdizimi

Sınıf özellikleri aşağıdaki sözdizimlerini kullanır:

Tek satırlık sözdizimi

[[<attribute>]...] [<property-type>] $<property-name> [= <default-value>]

Çok satırlı sözdizimi

[[<attribute>]...]
[<property-type>]
$<property-name> [= <default-value>]

Örnekler

Örnek 1 - Minimal sınıf özellikleri

ExampleProject1 sınıfının özellikleri, herhangi bir öznitelik veya varsayılan değer içermeyen yerleşik türleri kullanır.

class ExampleProject1 {
    [string]   $Name
    [int]      $Size
    [bool]     $Completed
    [string]   $Assignee
    [datetime] $StartDate
    [datetime] $EndDate
    [datetime] $DueDate
}

[ExampleProject1]::new()

$null -eq ([ExampleProject1]::new()).Name
Name      :
Size      : 0
Completed : False
StartDate : 1/1/0001 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM

True

Ad ve Assignee özelliklerinin varsayılan değeri $null'dur çünkü bunlar bir referans türü olan dizeler olarak yazılmıştır. Diğer özellikler, değer türü özellikleri olduğundan, tanımlı türleri için varsayılan değere sahiptir. Özelliklerin varsayılan değerleri hakkında daha fazla bilgi için bkz. Varsayılan özellik değerleri.

Örnek 2 - Özel türlere sahip sınıf özellikleri

ExampleProject2'nin özellikleri, PowerShell'de ExampleProject2 sınıfından önce tanımlanan özel bir numaralandırmayı ve sınıfı içerir.

enum ProjectState {
    NotTriaged
    ReadyForWork
    Committed
    Blocked
    InProgress
    Done
}

class ProjectAssignee {
    [string] $DisplayName
    [string] $UserName

    [string] ToString() {
        return "$($this.DisplayName) ($($this.UserName))"
    }
}

class ExampleProject2 {
    [string]          $Name
    [int]             $Size
    [ProjectState]    $State
    [ProjectAssignee] $Assignee
    [datetime]        $StartDate
    [datetime]        $EndDate
    [datetime]        $DueDate
}

[ExampleProject2]@{
    Name     = 'Class Property Documentation'
    Size     = 8
    State    = 'InProgress'
    Assignee = @{
        DisplayName = 'Mikey Lombardi'
        UserName    = 'michaeltlombardi'
    }
    StartDate = '2023-10-23'
    DueDate   = '2023-10-27'
}
Name      : Class Property Documentation
Size      : 8
State     : InProgress
Assignee  : Mikey Lombardi (michaeltlombardi)
StartDate : 10/23/2023 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 10/27/2023 12:00:00 AM

Örnek 3 - Doğrulama özniteliğine sahip sınıf özelliği

ExampleProject3 sınıfı, Size özelliğini, 0'dan büyük veya ona eşit ve 16'dan küçük veya ona eşit olması gereken bir tamsayı olarak tanımlar. ValidateRange'ı kullanır. değeri sınırlamak için öznitelik.

class ExampleProject3 {
                           [string]   $Name
    [ValidateRange(0, 16)] [int]      $Size
                           [bool]     $Completed
                           [string]   $Assignee
                           [datetime] $StartDate
                           [datetime] $EndDate
                           [datetime] $DueDate
}

$project = [ExampleProject3]::new()
$project
Name      :
Size      : 0
Completed : False
Assignee  :
StartDate : 1/1/0001 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM

ExampleProject3 başlatıldığında, Boyut varsayılan olarak 0 olur. Özelliğin geçerli aralıktaki bir değere ayarlanması, değeri günceller.

$project.Size = 8
$project
Name      :
Size      : 8
Completed : False
Assignee  :
StartDate : 1/1/0001 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM

Boyut aralığın dışında geçersiz bir değere ayarlandığında PowerShell bir istisna oluşturur ve değer değişmez.

$project.Size = 32
$project.Size = -1

$project
SetValueInvocationException:
Line |
   1 |  $project.Size = 32
     |  ~~~~~~~~~~~~~~~~~~
     | Exception setting "Size": "The 32 argument is greater than the
     | maximum allowed range of 16. Supply an argument that is less than
     | or equal to 16 and then try the command again."

SetValueInvocationException:
Line |
   2 |  $project.Size = -1
     |  ~~~~~~~~~~~~~~~~~~
     | Exception setting "Size": "The -1 argument is less than the minimum
     | allowed range of 0. Supply an argument that is greater than or
     | equal to 0 and then try the command again."

Name      :
Size      : 8
Completed : False
Assignee  :
StartDate : 1/1/0001 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM

Örnek 4 - Açık bir varsayılan değere sahip sınıf özelliği

ExampleProject4 sınıfı, StartDate özelliğinin değerini varsayılan olarak geçerli tarihe ayarlar.

class ExampleProject4 {
    [string]   $Name
    [int]      $Size
    [bool]     $Completed
    [string]   $Assignee
    [datetime] $StartDate = (Get-Date).Date
    [datetime] $EndDate
    [datetime] $DueDate
}

[ExampleProject4]::new()

[ExampleProject4]::new().StartDate -eq (Get-Date).Date
Name      :
Size      : 0
Completed : False
Assignee  :
StartDate : 10/23/2023 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM

True

Örnek 5 - Gizli sınıf özelliği

ExampleProject5 sınıfının Guid özelliği, hidden anahtar kelimesine sahiptir. Guid özelliği, sınıfın varsayılan çıktısında veya Get-Member tarafından döndürülen özellikler listesinde gösterilmez.

class ExampleProject5 {
           [string]   $Name
           [int]      $Size
           [bool]     $Completed
           [string]   $Assignee
           [datetime] $StartDate
           [datetime] $EndDate
           [datetime] $DueDate
    hidden [string]   $Guid      = (New-Guid).Guid
}

$project = [ExampleProject5]::new()

"Project GUID: $($project.Guid)"

$project

$project | Get-Member -MemberType Properties | Format-Table
Project GUID: c72cef84-057c-4649-8940-13490dcf72f0

Name      :
Size      : 0
Completed : False
Assignee  :
StartDate : 1/1/0001 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM


   TypeName: ExampleProject5

Name      MemberType Definition
----      ---------- ----------
Assignee  Property   string Assignee {get;set;}
Completed Property   bool Completed {get;set;}
DueDate   Property   datetime DueDate {get;set;}
EndDate   Property   datetime EndDate {get;set;}
Name      Property   string Name {get;set;}
Size      Property   int Size {get;set;}
StartDate Property   datetime StartDate {get;set;}

Örnek 6 - Statik sınıf özelliği

ExampleProject6 sınıfı, statik Projeler özelliğini oluşturulan tüm projelerin listesi olarak tanımlar. Sınıfın varsayılan yapıcısı yeni örneği projeler listesine ekler.

class ExampleProject6 {
           [string]            $Name
           [int]               $Size
           [bool]              $Completed
           [string]            $Assignee
           [datetime]          $StartDate
           [datetime]          $EndDate
           [datetime]          $DueDate
    hidden [string]            $Guid     = (New-Guid).Guid
    static [ExampleProject6[]] $Projects = @()

    ExampleProject6() {
        [ExampleProject6]::Projects += $this
    }
}

"Project Count: $([ExampleProject6]::Projects.Count)"

$project1 = [ExampleProject6]@{ Name = 'Project_1' }
$project2 = [ExampleProject6]@{ Name = 'Project_2' }

[ExampleProject6]::Projects | Select-Object -Property Name, Guid
Project Count: 0

Name      Guid
----      ----
Project_1 75e7c8a0-f8d1-433a-a5be-fd7249494694
Project_2 6c501be4-e68c-4df5-8fce-e49dd8366afe

Örnek 7 - Yapıcıda bir özelliğin tanımlanması

ExampleProject7 sınıfı, statik sınıf yapıcısındaki Duration komut dosyası özelliğini Update-TypeData cmdlet'iyle tanımlar. Update-TypeData veya Add-Member cmdlet'ini kullanmak, PowerShell sınıfları için gelişmiş özellikleri tanımlamanın tek yoludur.

Duration özelliği, hem StartDate hem de EndDate özellikleri ayarlanmadıkça ve belirtilmedikçe $null değerini döndürür. StartDate, BitişTarihi'nden önce olacak şekilde tanımlanır.

class ExampleProject7 {
    [string]   $Name
    [int]      $Size
    [bool]     $Completed
    [string]   $Assignee
    [datetime] $StartDate
    [datetime] $EndDate
    [datetime] $DueDate

    static [hashtable[]] $MemberDefinitions = @(
        @{
            MemberName = 'Duration'
            MemberType = 'ScriptProperty'
            Value      = {
                [datetime]$UnsetDate = 0

                $StartNotSet   = $this.StartDate -eq $UnsetDate
                $EndNotSet     = $this.EndDate   -eq $UnsetDate
                $StartAfterEnd = $this.StartDate -gt $this.EndDate

                if ($StartNotSet -or $EndNotSet -or $StartAfterEnd) {
                    return $null
                }

                return $this.EndDate - $this.StartDate
            }
        }
    )

    static ExampleProject7() {
        $TypeName = [ExampleProject7].Name
        foreach ($Definition in [ExampleProject7]::MemberDefinitions) {
            Update-TypeData -TypeName $TypeName @Definition
        }
    }

    ExampleProject7() {}

    ExampleProject7([string]$Name) {
        $this.Name = $Name
    }
}

$Project = [ExampleProject7]::new()
$Project

$null -eq $Project.Duration
Duration  :
Name      :
Size      : 0
Completed : False
Assignee  :
StartDate : 1/1/0001 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM

True

ExampleProject7 sınıfının bir örneğinin varsayılan görünümü süreyi içerir. StartDate ve EndDate özellikleri ayarlanmadığından Duration özelliği $null olur.

$Project.StartDate = '2023-01-01'
$Project.EndDate   = '2023-01-08'

$Project
Duration  : 7.00:00:00
Name      :
Size      : 0
Completed : False
Assignee  :
StartDate : 1/1/2023 12:00:00 AM
EndDate   : 1/8/2023 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM

Özellikler doğru ayarlandığında Süre özelliği, projenin ne kadar süreyle çalıştığını gösteren bir zaman aralığı döndürür.

Varsayılan özellik değerleri

Her sınıf özelliğinin, özelliğin türüne bağlı olarak örtülü bir varsayılan değeri vardır.

Bir özellik, bir dize veya nesne gibi bir referans türüyse, örtülü varsayılan değer $null olur. Bir özellik sayı, boolean veya numaralandırma gibi bir değer türüyse, özelliğin türe bağlı olarak varsayılan bir değeri vardır:

  • Tamsayılar ve kayan noktalı sayılar gibi sayısal türler varsayılan olarak 0'dır
  • Boolean değerleri varsayılan olarak $false'dır
  • Numaralandırmalar varsayılan olarak 0'dır; numaralandırma bile 0 için bir etiket tanımlamaz.

.NET'teki varsayılan değerler hakkında daha fazla bilgi için bkz. C# türlerinin varsayılan değerleri (C# başvurusu).

Bir özelliğe yönelik açık bir varsayılan değer tanımlamak için, özelliği varsayılan değere atamayla birlikte bildirin.

Örneğin, ProjectTask sınıfına ilişkin bu tanım, her yeni örneğe rastgele bir GUID atayarak Guid özelliği için açık bir varsayılan değer tanımlar.

class ProjectTask {
    [string] $Name
    [string] $Description
    [string] $Guid = (New-Guid).Guid
}

[ProjectTask]::new()
Name Description Guid
---- ----------- ----
                 aa96350c-358d-465c-96d1-a49949219eec

Gizli ve statik özellikler de varsayılan değerlere sahip olabilir.

Gizli özellikler

Bir sınıfın özelliklerini hidden anahtar sözcüğüyle bildirerek gizleyebilirsiniz. Gizli sınıf özellikleri şunlardır:

  • Sınıfın varsayılan çıktısına dahil edilmez.
  • Get-Member cmdlet'inin döndürdüğü sınıf üyeleri listesine dahil edilmez. Get-Member ile gizli özellikleri göstermek için Force parametresini kullanın.
  • Tamamlama gizli özelliği 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. Bunlara erişilebilir ve değiştirilebilir. Bir mülkü gizlemek onu özel yapmaz. Yalnızca önceki noktalarda açıklandığı gibi özelliği gizler.

gizli anahtar sözcüğü hakkında daha fazla bilgi için bkz. about_Hidden.

Statik özellikler

Özelliği static anahtar sözcüğüyle bildirerek, bir özelliği sınıfın örnekleri yerine sınıfın kendisine ait olacak şekilde tanımlayabilirsiniz. Statik sınıf özellikleri:

  • Sınıf örneklemesinden bağımsız olarak her zaman kullanılabilir.
  • Sınıfın tüm örneklerinde paylaşılır.
  • Her zaman mevcuttur.
  • Değiştirilebilir. Statik özellikler güncellenebilir. Varsayılan olarak değişmez değildirler.
  • Tüm oturum süresi boyunca canlı kalın.

Bu önemli

PowerShell'de tanımlanan sınıfların statik özellikleri değişmez değildir. Yapabilirler

Türetilmiş sınıf özellikleri

Bir sınıf bir temel sınıftan türetildiğinde, temel sınıfın özelliklerini miras alır. Gizli özellikler de dahil olmak üzere temel sınıfta tanımlanan tüm özellikler türetilmiş sınıfta mevcuttur.

Türetilmiş bir sınıf, miras alınan bir özelliği sınıf tanımında yeniden tanımlayarak geçersiz kılabilir. Türetilmiş sınıftaki özellik, yeniden tanımlanmış türü ve varsa varsayılan değeri kullanır. Devralınan özellik varsayılan bir değer tanımladıysa ve yeniden tanımlanan özellik tanımlamıyorsa, devralınan özelliğin varsayılan değeri yoktur.

Türetilmiş bir sınıf, statik bir özelliği geçersiz kılmazsa, statik özelliğe türetilmiş sınıf aracılığıyla erişildiğinde, temel sınıfın statik özelliğine de erişilir. Özellik değerinin türetilmiş sınıf aracılığıyla değiştirilmesi, temel sınıftaki değeri değiştirir. Statik özelliği geçersiz kılmayan diğer türetilmiş sınıflar da temel sınıftaki özelliğin değerini kullanır. Miras alınan bir statik özelliğin değerini, özelliği geçersiz kılmayan bir sınıfta güncellemek, aynı temel sınıftan türetilen sınıflar üzerinde istenmeyen etkilere neden olabilir.

Aşağıdaki örnek, türetilmiş sınıflardaki statik ve örnek özelliklere ilişkin davranışı gösterir.

class BaseClass {
    static [string] $StaticProperty = 'Static'
    [string] $InstanceProperty = 'Instance'
}
class DerivedClassA : BaseClass     {}
class DerivedClassB : BaseClass     {}
class DerivedClassC : DerivedClassB {
    [string] $InstanceProperty
}
class DerivedClassD : BaseClass {
    static [string] $StaticProperty = 'Override'
    [string] $InstanceProperty = 'Override'
}

"Base instance      => $([BaseClass]::new().InstanceProperty)"
"Derived instance A => $([DerivedClassA]::new().InstanceProperty)"
"Derived instance B => $([DerivedClassB]::new().InstanceProperty)"
"Derived instance C => $([DerivedClassC]::new().InstanceProperty)"
"Derived instance D => $([DerivedClassD]::new().InstanceProperty)"
Base instance      => Instance
Derived instance A => Instance
Derived instance B => Instance
Derived instance C =>
Derived instance D => Override

DerivedClassC için InstanceProperty boş bir dizedir çünkü sınıf, özelliği varsayılan bir değer ayarlamadan yeniden tanımlamıştır. DerivedClassD için değer Override'dır çünkü sınıf, özelliği varsayılan değer olarak bu dizeyle yeniden tanımlamıştır.

"Base static        => $([BaseClass]::StaticProperty)"
"Derived static A   => $([DerivedClassA]::StaticProperty)"
"Derived static B   => $([DerivedClassB]::StaticProperty)"
"Derived static C   => $([DerivedClassC]::StaticProperty)"
"Derived static D   => $([DerivedClassD]::StaticProperty)"
Base static        => Static
Derived static A   => Static
Derived static B   => Static
Derived static C   => Static
Derived static D   => Override

DerivedClassD dışında, türetilmiş sınıfların statik özelliğinin değeri, özelliği yeniden tanımlamadıkları için temel sınıfla aynıdır. Bu, doğrudan BaseClass yerine DerivedClassB'den miras alan DerivedClassC için bile geçerlidir.

[DerivedClassA]::StaticProperty = 'Updated from A'
"Base static        => $([BaseClass]::StaticProperty)"
"Derived static A   => $([DerivedClassA]::StaticProperty)"
"Derived static B   => $([DerivedClassB]::StaticProperty)"
"Derived static C   => $([DerivedClassC]::StaticProperty)"
"Derived static D   => $([DerivedClassD]::StaticProperty)"
Base static        => Updated from A
Derived static A   => Updated from A
Derived static B   => Updated from A
Derived static C   => Updated from A
Derived static D   => Override

StaticProperty'e DerivedClassA aracılığıyla erişildiğinde ve değiştirildiğinde, değiştirilen değer DerivedClassD dışındaki her sınıfı etkiler.

Kapsamlı bir örnek de dahil olmak üzere sınıf mirası hakkında daha fazla bilgi için bkz. about_Classes_Inheritance.

Özellik niteliklerini kullanma

PowerShell, veri türü bilgilerini geliştirmek ve bir özelliğe atanan verileri doğrulamak için kullanabileceğiniz çeşitli öznitelik sınıfları içerir. Doğrulama nitelikleri, özelliklere verilen değerlerin tanımlanan gereksinimleri karşılayıp karşılamadığını test etmenize olanak tanır. Doğrulama, değer atandığı anda tetiklenir.

Kullanılabilir nitelikler hakkında daha fazla bilgi için bkz. about_Functions_Advanced_Parameters.

Update-TypeData ile örnek özelliklerini tanımlama

Özellikleri doğrudan sınıf tanımında bildirmenin ötesinde, Update-TypeData cmdlet'ini kullanarak statik oluşturucuda bir sınıfın örnekleri için özellikleri tanımlayabilirsiniz.

Bu parçayı model için bir başlangıç noktası olarak kullanın. Açılı parantez içindeki yer tutucu metni gerektiği gibi değiştirin.

class <ClassName> {
    static [hashtable[]] $MemberDefinitions = @(
        @{
            MemberName = '<PropertyName>'
            MemberType = '<PropertyType>'
            Value      = <ValueDefinition>
        }
    )

    static <ClassName>() {
        $TypeName = [<ClassName>].Name
        foreach ($Definition in [<ClassName>]::MemberDefinitions) {
            Update-TypeData -TypeName $TypeName @Definition
        }
    }
}

Yararlı ipucu

Add-Member cmdlet'i, statik olmayan kuruculardaki bir sınıfa özellikler ve yöntemler ekleyebilir, ancak cmdlet, kurucu her çağrıldığında çalıştırılır. Statik oluşturucuda Update-TypeData'nın kullanılması, üyelerin sınıfa eklenmesine yönelik kodun oturumda yalnızca bir kez çalıştırılmasının yeterli olmasını sağlar.

Salt okunur özellikler gibi, yalnızca Update-TypeData ile tanımlanamayan statik olmayan oluşturuculardaki özellikleri sınıfa ekleyin.

Takma ad özelliklerini tanımlama

Alias özelliğinin sınıf özelliği bildiriminde kullanıldığında hiçbir etkisi yoktur. PowerShell bu özniteliği yalnızca cmdlet, parametre ve işlev adlarına yönelik takma adları tanımlamak için kullanır.

Bir sınıf özelliğine yönelik takma ad tanımlamak için Update-TypeData'yı AliasProperty MemberType ile birlikte kullanın.

Örneğin, OperablePair sınıfının bu tanımı, LeftHandSide ve < takma adlarıyla x ve y iki tam sayı özelliğini tanımlar. sırasıylaRightHandSide.

class OperablePair {
    [int] $x
    [int] $y

    static [hashtable[]] $MemberDefinitions = @(
            @{
                MemberType = 'AliasProperty'
                MemberName = 'LeftHandSide'
                Value      = 'x'
            }
            @{
                MemberType = 'AliasProperty'
                MemberName = 'RightHandSide'
                Value      = 'y'
            }
    )

    static OperablePair() {
        $TypeName = [OperablePair].Name
        foreach ($Definition in [OperablePair]::MemberDefinitions) {
            Update-TypeData -TypeName $TypeName @Definition
        }
    }

    OperablePair() {}

    OperablePair([int]$x, [int]$y) {
        $this.x = $x
        $this.y = $y
    }

    # Math methods for the pair of values
    [int]   GetSum()        { return $this.x + $this.y }
    [int]   GetProduct()    { return $this.x * $this.y }
    [int]   GetDifference() { return $this.x - $this.y }
    [float] GetQuotient()   { return $this.x / $this.y }
    [int]   GetModulus()    { return $this.x % $this.y }
}

Tanımlanan takma adlarla kullanıcılar özelliklere her iki adla da erişebilir.

$pair = [OperablePair]@{ x = 8 ; RightHandSide = 3 }

"$($pair.x) % $($pair.y) = $($pair.GetModulus())"

$pair.LeftHandSide  = 3
$pair.RightHandSide = 2
"$($pair.x) x $($pair.y) = $($pair.GetProduct())"
8 % 3 = 2

3 x 2 = 6

Hesaplanan özellikleri tanımlama

Diğer özelliklerin değerlerine başvuran bir özellik tanımlamak için Update-TypeData cmdlet'ini ScriptProperty MemberType ile birlikte kullanın.

Örneğin, Bütçe sınıfının bu tanımı, Giderler ve Gelirler özelliklerini kayan noktalı sayıların dizileri olarak tanımlar. Toplam giderler, toplam gelirler ve net gelir için hesaplanan özellikleri tanımlamak üzere Update-TypeData cmdlet'ini kullanır.

class Budget {
    [float[]] $Expenses
    [float[]] $Revenues

    static [hashtable[]] $MemberDefinitions = @(
        @{
            MemberType = 'ScriptProperty'
            MemberName = 'TotalExpenses'
            Value      = { ($this.Expenses | Measure-Object -Sum).Sum }
        }
        @{
            MemberType = 'ScriptProperty'
            MemberName = 'TotalRevenues'
            Value      = { ($this.Revenues | Measure-Object -Sum).Sum }
        }
        @{
            MemberType = 'ScriptProperty'
            MemberName = 'NetIncome'
            Value      = { $this.TotalRevenues - $this.TotalExpenses }
        }
    )

    static Budget() {
        $TypeName = [Budget].Name
        foreach ($Definition in [Budget]::MemberDefinitions) {
            Update-TypeData -TypeName $TypeName @Definition
        }
    }

    Budget() {}

    Budget($Expenses, $Revenues) {
        $this.Expenses = $Expenses
        $this.Revenues = $Revenues
    }
}

[Budget]::new()

[Budget]@{
    Expenses = @(2500, 1931, 3700)
    Revenues = @(2400, 2100, 4150)
}
TotalExpenses : 0
TotalRevenues : 0
NetIncome     : 0
Expenses      :
Revenues      :

TotalExpenses : 8131
TotalRevenues : 8650
NetIncome     : 519
Expenses      : {2500, 1931, 3700}
Revenues      : {2400, 2100, 4150}

Özel get ve set mantığıyla özellikleri tanımlama

PowerShell sınıfı özellikleri, özel alıcı ve ayarlayıcı mantığını doğrudan tanımlayamaz. hidden anahtar kelimesiyle bir destek özelliği tanımlayarak ve değeri almak ve ayarlamak için özel mantığa sahip görünür bir özellik tanımlamak üzere Update-TypeData'yı kullanarak bu işlevselliğe yaklaşık değer verebilirsiniz.

Geleneksel olarak, gizli destek özelliği adını bir alt çizgi önekiyle tanımlayın ve deve tipi büyük/küçük harf kullanın. Örneğin, TaskCount yerine, gizli destek özelliğine _taskCount adını verin.

Bu örnekte ProjectSize sınıfı, _value adında gizli bir tam sayı özelliğini tanımlar. Value'u, _value özelliğini almak ve ayarlamak için özel mantığa sahip bir ScriptProperty olarak tanımlar. Ayarlayıcı scriptblock, projenin dize gösterimini doğru boyuta dönüştürmeyi yönetir.

class ProjectSize {
    hidden [ValidateSet(0, 1, 2, 3)] [int] $_value

    static [hashtable[]] $MemberDefinitions = @(
        @{
            MemberType  = 'ScriptProperty'
            MemberName  = 'Value'
            Value       = { $this._value } # Getter
            SecondValue = {                # Setter
                $ProposedValue = $args[0]

                if ($ProposedValue -is [string]) {
                    switch ($ProposedValue) {
                        'Small'  { $this._value = 1 ; break }
                        'Medium' { $this._value = 2 ; break }
                        'Large'  { $this._value = 3 ; break }
                        default  { throw "Unknown size '$ProposedValue'" }
                    }
                } else {
                    $this._value = $ProposedValue
                }
            }
        }
    )

    static ProjectSize() {
        $TypeName = [ProjectSize].Name
        foreach ($Definition in [ProjectSize]::MemberDefinitions) {
            Update-TypeData -TypeName $TypeName @Definition
        }
    }

    ProjectSize()              {}
    ProjectSize([int]$Size)    { $this.Value = $Size }
    ProjectSize([string]$Size) { $this.Value = $Size }

    [string] ToString() {
        $Output = switch ($this._value) {
            1       { 'Small'     }
            2       { 'Medium'    }
            3       { 'Large'     }
            default { 'Undefined' }
        }

        return $Output
    }
}

Özel alıcı ve ayarlayıcı tanımlandığında Value özelliğini bir tam sayı veya dize olarak ayarlayabilirsiniz.

$size = [ProjectSize]::new()
"The initial size is: $($size._value), $size"

$size.Value = 1
"The defined size is: $($size._value), $size"

$Size.Value += 1
"The updated size is: $($size._value), $size"

$Size.Value = 'Large'
"The final size is:   $($size._value), $size"
The initial size is: 0, Undefined

The defined size is: 1, Small

The updated size is: 2, Medium

The final size is:   3, Large

Sınırlamalar

PowerShell sınıfı özellikleri aşağıdaki sınırlamalara sahiptir:

  • 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-TypeData cmdlet'ini kullanın.

  • Bir PowerShell sınıfı ConvertTo-Json cmdlet'iyle 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

Ayrıca bakınız

  • about_Classes
  • about_Classes_Constructors
  • about_Classes_Inheritance
  • about_Classes_Methods

İlgili makaleler