Aar*_*ide 14 c# templates lazy-evaluation
示例1(不编译):
void Main()
{
var c = new C<D>();
c.M.F();
}
class C<T>
{
T _m = null;
public T M { get {
if(_m == null) _m = new T();
return _m;
} }
}
class D
{
public void F() { Console.WriteLine ("i was created"); }
}
Run Code Online (Sandbox Code Playgroud)
结果:
无法创建变量类型"T"的实例,因为它没有new()约束
例2(作品):
void Main()
{
var c = new C<D>();
c.M.F();
}
class C<T>
{
Lazy<T> _m = new Lazy<T>();
public T M { get { return _m.Value; } }
}
class D
{
public void F() { Console.WriteLine ("i was created"); }
}
Run Code Online (Sandbox Code Playgroud)
结果:
i was created
Run Code Online (Sandbox Code Playgroud)
Kir*_*oll 17
如果您深入研究源代码,您将看到Lazy<T>最终使用Activator:
return new Lazy<T>.Boxed((T)Activator.CreateInstance(typeof(T)));
Run Code Online (Sandbox Code Playgroud)
这只是使用反射的捷径.由于它不通过实际泛型类型参数(new T())实例化类型,而是通过反射调用构造函数,因此不需要where T : new()约束.
| 归档时间: |
|
| 查看次数: |
1493 次 |
| 最近记录: |