最近、クラスの使い方を試していますが、今の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; }
}
}
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....mmmを使用した拡張方法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が理想的だと思います。私はそれを怠惰にインスタンス化されたパラメータと考えていると思います。それは必要なときにだけ実行されるので、効率を節約できますが、私は正しいですか?