class Poly
{
public static void WriteVal(int i) { System.Console.Write("{0}\n", i); }
public static void WriteVal(string s) { System.Console.Write("{0}\n", s); }
}
class GenWriter<T>
{
public static void Write(T x) { Poly.WriteVal(x); }
}
Run Code Online (Sandbox Code Playgroud)
为什么无辜(对于C++程序员)方法写入在C#中是不可接受的?
您可以看到编译器在实例化之前尝试将参数类型T与具体重载匹配:
错误3'TestGenericPolyMorph.Poly.WriteVal(int)'的最佳重载方法匹配有一些无效的参数
当然.目的不是使用上面的静态方法,目的是创建一个具有多态行为的包装器.注意:我使用的是VS 2010.
请注意,所有需要的信息都可在编译时获得.再一次:问题是在模板实例化之前执行验证.
讨论后增加:
好吧,可能我没有正确地强调这一点.问题不仅在于泛型和模板之间的区别,还在于解决以下问题:给定一组解决不同类型的重载,我想生成一组包装类,为这些类型提供虚方法(多态).运行时虚拟方法的解析价格很小,并没有达到性能.这是C++模板很方便的地方.显然,动态的运行时类型解析的开销是完全不同的.因此,问题是,是否可以在不复制代码的情况下将现有的重载转换为多态,并且不会牺牲性能损失(例如,我不确定动态与"switch"相比,除了更好的语法之外的"switch").
到目前为止我见过的解决方案之一是生成/发出代码(sic!),即不是自动剪切和粘贴.
因此,我们只需手动执行或仅重新创建宏/模板处理器,而不是C++模板处理.
还有什么更好的?
由于各种原因,包含在.NET 4.5和Async CTP 4.0 中等待的流可能会卡住,例如,因为远程客户端没有响应.当然,WaitForAny,当我们等待一些超时任务时,是一个明显的解决方案,用于恢复高级流程.但是,这并没有解决所有可能的问题.
我有以下问题:
等待的环境会发生什么变化?据我所知,这会造成内存泄漏.我对吗?
如何检查调试器或使用相应的API 在应用程序中存在多少悬空" awaiter "?
是否可以在全球范围内枚举它们?
如果3.是正确的,是否可以强制取消这些*await*s 的任务(即清理)?
注意:在问题4中,我不询问在显式创建任务期间要使用的取消项目.我指的是间接创建任务的情况:
async Task<bool> SomeTask()
{
await Something();
...
return true;
}
Run Code Online (Sandbox Code Playgroud)
这个问题的动机: