为什么不重载get_ / set_函数按预期工作?

时间:2018-02-02 14:45:33

标签: class powershell-v5.0

显然,自定义getter和setter方法are not supported with Powershell Classes

在检查从Powershell v5类构建的Powershell对象实例时,我们发现为该类定义[type]Property会在对象实例中创建隐藏的[type]get_Property()[void]set_Property([type])方法:

class myClass {
    [int]$Property
}

[myClass]::new() | Get-Member -Force | Where-Object { $_.Name -like "*Property" }
   TypeName: myClass

Name         MemberType Definition             
----         ---------- ----------             
get_Property Method     int get_Property()     
set_Property Method     void set_Property(int )
Property     Property   int Property {get;set;}

如果getter / setter方法对于使用=运算符访问属性至关重要,.Equals([object])-eq运算符会调用-ne方法,我们应该能够重载默认的getter / setter方法并看到它简单地工作

class myClass {
    [int]$Property

    hidden [void]set_Property([int]$Property) {
        $this.Property=$Property * 10
    }

    [boolean]Equals([object]$Element) {
        Return $true
    }
}

然而,=运算符肯定不会调用$leftObject.set_Property($right)

$myObject = [myClass]::new()
$myObject.Property = 3
$myObject.Property
3

与此同时,我们发现-eq确实在调用([myClass]$left).Equals($right)

$myObject -eq "anything"
True

因此,查看Powershell类实现的机制, 为什么 具有属性'如果=运算符没有使用它们,那么getter / setter是否构建为隐藏方法?有没有任何技术原因可以隐式创建getter / setter方法,或者只是一些方便或约定而没有任何类型的操作符绑定?

0 个答案:

没有答案