当我在同一个类的类方法中使用属性而不是字段时,是否有任何原因/差异?

时间:2015-06-01 12:29:14

标签: c#

让我通过以下示例更具体:

public class Cat
{
   public string Name { get; set; }
   public string Color { get; set; }

   public Cat()
   {
       Cat("Unamed", "gray");
   }

   public Cat(string name, string color)
   {
       Name = name;
       Color = color;
   }

   public void SayMiau()
   {
       Console.WriteLine("Cat {0} says Miau!!!!!!!!!!", Name);
   }
}

在SayMiau方法中,我使用属性Name而不是使用字段名称 作为类方法中的参数 有什么不同吗?(计算成本?)
当我为同一个类制作方法签名时,这被认为是一个坏/好的做法吗?

1 个答案:

答案 0 :(得分:3)

当你读取一个属性时,这实际上被编译为对方法的调用。

因此,这段代码:

 public void SayMiau()
 {
     Console.WriteLine("Cat {0} says Miau!!!!!!!!!!", Name);
 }

可以理解为此代码:

 public void SayMiau()
 {
     Console.WriteLine("Cat {0} says Miau!!!!!!!!!!", get_Name());
 }

请注意,方法名称get_Name中没有您可以直接调用的内容,它被标记为特殊的编译器提供的属性方法。

但是,如果方法调用很小,则会内联它们,因此,由于您只返回了一个支持字段的值,所以当JITter将此代码添加到本机代码中时,该调用可能会被直接读取所取代支持领域。

但是,将来,如果更改此属性以使其getter具有更多计算逻辑,则该内联将停止发生,而不是调用该方法。

现在,说了这么多,你可以直接访问支持字段,但作为指导我会使用该属性,除非你有充分的理由不这样做。请注意,除非您将大量代码放入getter中,否则这不太可能成为性能瓶颈,但性能问题必须通过其他方式解决,而不仅仅是修补,衡量度量度量。