【问题标题】:How do properties work when storing objects?存储对象时属性如何工作?
【发布时间】:2018-08-05 00:21:32
【问题描述】:

在 C# 中,与原始类型一起使用的属性看起来相当简单。例如,在一个整数上,具有以下属性:

private int _foo = 9;

public int Foo 
{
    get 
    {
        return _foo;
    }
    set
    {
        _foo = value;
    }
}

很容易发现,当用户键入时,例如,int bar = Foo 将返回 _foo 的值,并将其分配给变量 bar。同样,Foo = 10,支持字段 _foo 的值更改为 10。但是,当对象(不是指 c# 的 object 关键字)存储在可以具有方法的属性中时,这变得更加复杂。例如:

public class Sample 
{
    private int NoGoodName

    public Sample() {}

    public void Method1() 
    {
        NoGoodName *= 2;
    }
}

public Sample TestSample {get; set;}

如果用户调用,比如说,TestSample.Method1(),究竟会发生什么?它会调用getter,然后在返回值上调用Method1,还是先调用Method1(),然后将TestSample设置为结果?

【问题讨论】:

  • 当属性不是值类型并且是引用类型(对象)时,属性返回对该对象的引用,然后在该引用所引用的对象上调用该方法。把它想象成一根绳子,一端系在物体上,另一端可以绕过去(或者你可以有很多绳子,但它们都系在同一个物体上)。因此,当您访问该属性时,绳索会传递给您,现在您可以通过绳索与对象进行通信(调用方法)。

标签: c# oop properties


【解决方案1】:

它会调用getter,然后调用Method1

这是因为. operator 是左关联的。像x.y.z 这样的表达式总是从左到右计算。这也合乎逻辑。左操作数 (TestSample) 需要在调用方法之前进行评估,否则运行时如何知道在哪个实例上调用方法?

如果您难以理解 getter 和 setter 的概念。尝试将获取属性想象为调用Get... 方法并将属性设置为调用Set... 方法。例如:

GetTestSample().Method1(); // TestSample.Method1()
SetSomeValue(10); // SomeValue = 10;

这可能会让你更清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2018-12-22
    • 2015-03-14
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多