2014-02-17 110 views
1

这可能是一个微不足道的问题,但我对此非常困惑。我有一个有一些逻辑的财产。当我们调用“设置”属性时,“get”被调用

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

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

现在当我要分配一些东西给这个属性时会发生什么。

SomeProperty = new SomeClass(); 

我想这里得到的将是这里调用。它的话可以说就像get SomeProperty和set那个属性。但我所观察到的是get未被调用。只有二​​传手被称为(纠正我,如果我在这里错了)。我想知道这里是不是叫get是什么原因。

+0

为什么要调用它? –

+0

为什么让财产然后设置它!? – VahidNaderi

+1

从语言设计的角度来看,这会非常愚蠢的,不是吗?请记住,属性是语法糖。你有两种方法; property_Get和property_Set。如果你明确地写了这两个方法,当你调用property_Set时,你不会期望调用property_Get(),对吗? –

回答

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; 
     } 
    } 
} 

输出:

在二传手

1

不,get在您正在读取属性的值时被调用,set在您为属性赋值时被调用。

1

我在这里想,得到的将是这里称为

为什么?你很清楚 - 你设置了。 SET在GET中不做任何事情。埃尔戈,永远不会被调用。

1

这是mutator方法正确的行为,你不读,从访问

1

值时,您不要在此表达需要的SomeProperty值。如果你写了类似​​3210的东西,那么你将需要值SomeProperty,并且将调用get

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()); 

当这样的思想,很明显,吸气不叫当您指定财产。

1

实际上

属性是,提供了一个灵活的机制来读,写 或计算私有字段的值的构件。属性可以使用 就好像它们是公共数据成员一样,但是它们实际上是专用的 方法称为访问器

如其在msdn中所述。 所以把它作为像这样的东西的包装:

private SomeObject _someProperty; 

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

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

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

3

在以更简单的方法考虑一下。

GET:什么地方想要从这里获取价值。

SET:某处某处想设置值的地方。

因此,获得者和制定者从外部的角度回答问题。当你想写值时,SET被调用。当你想知道当前值时,调用GET。

相关问题