当我们为一个属性调用“set”时,“get”被调用

时间:2014-02-17 06:00:38

标签: c# getter-setter

这可能是一个微不足道的问题,但我对此非常困惑。我有一个有一些逻辑的属性。

private SomeObject _someProperty;
public SomeObject SomeProperty
{
    get
    {
        Some checking here,

        return _someProperty;
    }
    set
    {
        _someProperty = value;
    }
}

现在,当我要为此属性分配内容时会发生什么。

SomeProperty = new SomeClass();

我在这里想到的将会在这里被称为。它可以说是get SomeProperty和set那个属性。但我观察到的是get没有被调用。只调用setter(如果我错了,请纠正我)。我想知道在这里没有调用get是什么原因。

8 个答案:

答案 0 :(得分:3)

以更简单的方式思考它。

GET:当某个地方想要从这里获取价值时。

SET:当某个地方想要在这里设置值时。

因此,吸气者和制定者从外部角度回答问题。当你想写值时,调用SET。当你想知道当前值时,就会调用GET。

答案 1 :(得分:2)

属性实际上只是get / set方法的语法糖。正如C# Programming Guide所说:

  

属性是一种成员,它提供了一种灵活的机制来读取,写入或计算私有字段的值。属性可以像它们是公共数据成员一样使用,但它们实际上是称为访问器的特殊方法。这样可以轻松访问数据,并且仍然有助于提高方法的安全性和灵活性。

因此,您的示例实际上转换为:

private SomeObject _someProperty;
public SomeObject get_SomeProperty()
{
    // Some checking here,

    return _someProperty;
}

public void set_SomeProperty(SomeObject value)
{
    _someProperty = value;
}

分配变为

set_SomeProperty(new SomeClass());

当想到这种方式时,显然在分配属性时不会调用getter。

答案 2 :(得分:1)

不,在您阅读属性的值时调用get,在为属性赋值时调用set

答案 3 :(得分:1)

  

我在这里想到的将会在这里被称为

为什么呢?你很清楚 - 你设置。并且SET在GET中没有做任何事情。因此,get永远不会被称为。

答案 4 :(得分:1)

这是mutator方法的正确行为,你不要从存取器读取值

答案 5 :(得分:1)

此表达式中不需要SomeProperty的值。如果你写了类似SomeProperty = SomeProperty + 1;的内容,那么你需要SomeProperty的值,并且会调用get

答案 6 :(得分:1)

实际上

  

属性是一个提供灵活读取机制的成员,   写或计算私有字段的值。可以使用属性   好像他们是公共数据成员,但他们实际上是特殊的   称为访问者的方法

正如在msdn中所说的那样。 因此,请将其视为这样的包装:

private SomeObject _someProperty;

public SomeObject getSomeProperty()
{
    //Some checking here,

    return _someProperty;
}
public void setSomeProperty(SomeObject value)
{
    _someProperty = value;
}

现在应该清楚,除非你有关于设置字段的相同问题。

答案 7 :(得分:1)

不,在设置属性时不会调用属性的getter,这很容易证明:

static class Program
{
    static void Main(string[] args)
    {
        Foo foo = new Foo();
        foo.Number = 7;
    }
}

public class Foo
{
    private int number;
    public int Number
    {
        get
        {
            Console.WriteLine("In getter");
            return this.number;
        }

        set
        {
            Console.WriteLine("In setter");
            this.number = value;
        }
    }
}

输出:

  

在setter中