C#和优化中小方法调用的成本

时间:2011-04-13 10:43:59

标签: c# .net oop optimization compiler-optimization

我想知道调用短方法的开销是什么,或者代码是否会以任何方式进行优化,如果它与getter的成本不同?

我只是举个例子,因为很难解释。

我有一个ClaimsManager用于获取特定声明并返回它们的网站。从另一个获得一个声明的过程只有一个ClaimsType字符串。

public string GetClaimValueByType(string ClaimType)
{
    return (from claim in _claimsIdentity.Claims
              where claim.ClaimType == ClaimType
              select claim.Value).SingleOrDefault();
}

/*Again would this be better or worse if I wanted to be able to choose if 
I want the claim versus the value?

public Claim GetClaimByType(string ClaimType)
{
    return (from claim in _claimsIdentity.Claims
              where claim.ClaimType == ClaimType
              select claim).SingleOrDefault();
}

public string GetClaimValueByType(string ClaimType)
{
    return GetClaimByType(ClaimType).Value;
}
*/    
public string GetEmail()
{
    return GetClaimValueByType(ClaimTypes.Email);
}

/* Or should I use getters?...
public string Email
{
    get
    {
        return return GetClaimValueByType(ClaimTypes.Email);
    }
}
*/

使用这些简短的get方法是不是很糟糕?是否应该有大量的呼叫开销,因为它太短或者会优化吗?最后,在这里实际使用吸气剂更有意义吗?..

由于

3 个答案:

答案 0 :(得分:5)

在我看来,使用setter和getter可能带来的边际开销远远超过了干净且易于维护的代码,这些代码很可能对于街上的任何.NET开发人员来说都更容易选择和运行。

但我想这也取决于你的Claim对象有多大。 :)

答案 1 :(得分:2)

性能方面,getter和方法之间没有区别。 getter只是语法糖,在编译期间转换为方法。关于何时使用getter以及何时使用方法,有一些一般性的指导原则。 This msdn page建议在以下情况下使用方法而不是属性:

  • 该操作是转换,例如Object.ToString。
  • 操作非常昂贵,您希望与用户沟通,他们应该考虑缓存结果。
  • 使用get访问器获取属性值会产生可观察到的副作用。
  • 连续两次致电会员会产生不同的结果。
  • 执行顺序很重要。请注意,应该能够以任何顺序设置和检索类型的属性。
  • 该成员是静态的,但返回一个可以更改的值。
  • 该成员返回一个数组。返回数组的属性可能会产生误导。通常需要返回内部数组的副本,以便用户无法更改内部状态。这与用户可以轻易地认为它是索引属性的事实相结合,导致代码效率低下。

答案 2 :(得分:-2)

我不会为此使用getter,属性旨在返回常量值。这意味着有序调用应该返回相同的值。这只是一个概念性的事情。