让我通过以下示例更具体:
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而不是使用字段名称
作为类方法中的参数
有什么不同吗?(计算成本?)
当我为同一个类制作方法签名时,这被认为是一个坏/好的做法吗?
答案 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中,否则这不太可能成为性能瓶颈,但性能问题必须通过其他方式解决,而不仅仅是修补,衡量度量度量。