最近我一直在尝试使用这个Func<T>
类,到目前为止我很喜欢它。然而,我注意到我越来越多地开始使用它而不是实际使用 的实例T
,所以我想问一下;使用vs的开销是多少?Func<T>
T
我知道这是一个有点笼统的问题,T
任何事情都可以,所以我想这个问题应该集中在传递函数而不是简单对象的实例的开销上?
为了论证,让我们假设以下内容。
我们的模拟对象,T
public class Person
{
private string _name = string.Empty;
private int _age = 0;
private bool _isMale = true;
public Person(string name, int age, bool isMale)
{
this.Name = name;
this.Age = age;
this.IsMale = isMale;
}
public string Name
{
get { return this._name; }
set { this._name = value; }
}
public int Age
{
get { return this._age; }
set { this._age = value; }
}
public bool IsMale
{
get { return this._isMale; }
set { this._isMale = value; }
}
}
现在,假设我们有一个漂亮的扩展方法 on IDictionary
,它通过键选择值或默认值。伪代码可以描述如下:
KeyValuePair 集合中是否找到键 是,返回值 否,返回默认值
选项1.我们的扩展方法使用一个实例T
public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary source, TKey key, TValue @default)
{
if (source.ContainsKey(key))
{
return source[key];
}
return @default;
}
// usage
var myValue = myDictionary.GetValueOrDefault("Richard", new Person());
选项 2. 我们的扩展方法使用Func<T>
... 嗯,漂亮!
public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary source, TKey key, Func<TValue> defaultSelector)
{
if (source.ContainsKey(key))
{
return source[key];
}
return defaultSelector();
}
// usage
var myValue = myDictionary.GetValueOrDefault("Richard", () => new Person("Richard", 25, true));
比较
比较上述选项,很明显两者都有潜在的好处。选项 1 更容易阅读,但是我目前喜欢使用Func<T>
,因此对我来说选项 2 似乎很理想。我想我认为它是一个惰性实例化的参数,它只在需要时执行,因此可以节省效率,但我说的对吗?