这可能是一个微不足道的问题,但我对此非常困惑。我有一个有一些逻辑的属性。
private SomeObject _someProperty;
public SomeObject SomeProperty
{
get
{
Some checking here,
return _someProperty;
}
set
{
_someProperty = value;
}
}
现在,当我要为此属性分配内容时会发生什么。
SomeProperty = new SomeClass();
我在这里想到的将会在这里被称为。它可以说是get
SomeProperty和set
那个属性。但我观察到的是get
没有被调用。只调用setter(如果我错了,请纠正我)。我想知道在这里没有调用get
是什么原因。
答案 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中