小编Yur*_* S.的帖子

C#中的多态,重载和泛型

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++模板处理.

还有什么更好的?

c# generics polymorphism overloading

12
推荐指数
2
解决办法
1108
查看次数

在异步编程中悬空等待和可能的内存泄漏

由于各种原因,包含在.NET 4.5和Async CTP 4.0 中等待的流可能会卡住,例如,因为远程客户端没有响应.当然,WaitForAny,当我们等待一些超时任务时,是一个明显的解决方案,用于恢复高级流程.但是,这并没有解决所有可能的问题.

我有以下问题:

  1. 等待的环境会发生什么变化?据我所知,这会造成内存泄漏.我对吗?

  2. 如何检查调试器或使用相应的API 在应用程序中存在多少悬空" awaiter "?

  3. 是否可以在全球范围内枚举它们?

  4. 如果3.是正确的,是否可以强制取消这些*await*s 的任务(即清理)?

注意:在问题4中,我不询问在显式创建任务期间要使用的取消项目.我指的是间接创建任务的情况:

async Task<bool> SomeTask()
{
   await Something();
   ...
   return true;
}
Run Code Online (Sandbox Code Playgroud)

这个问题的动机:

  1. 试图避免内存泄漏
  2. 尝试使用涉及取消令牌的太多案例来复制代码
  3. 在许多情况下,每个低级别任务事先都不知道超时,但高级别流程可以只使用恢​​复方法:"我们被卡住了?没关系,只是清理并让我们重新开始".

c# error-handling asynchronous async-ctp .net-4.5

10
推荐指数
2
解决办法
3559
查看次数