如何在 C# 里写出零额外开销(避免虚拟方法调用)的 CRTP 成语

geelaw:考虑 C++ 代码

#include<iostream>

template <typename T>
struct Base
{
  T &Foo()
  {
    // MSVC 需要这个提示来优化 static_cast 的空指针检查。
    // __assume(this != nullptr);
    static_cast<T *>(this)->FooImpl();
    return *static_cast<T *>(this);
  }
protected:
  ~Base() = default;
};

struct Derived : Base<Derived>
{
private:
  friend Base<Derived>;
  void FooImpl() { std::cout << "没有虚拟方法调用" << std::endl; }
};

问题是如何在 C# 里做出等价实现,满足:

  • 没有虚拟方法调用,或者子类可以决定 FooImpl 是否虚拟。
  • 至少在运行时保证 Base 的泛型参数是正确的子类。
  • 除非运行时使用反射作弊,否则不能破坏类的封装(需要实现有限程度的 friend),且编译期也不能破坏封装。

第一个问题可以通过利用 CLR 对泛型参数实例化为 struct 时的优化实现,第二个则需要巧妙设置对应 struct 的接口和实现,使只有 Base 及其子类可以正常访问方法。

详见 全文(英文)

如何在 SDWebImage 下载图片前先获取包含图片链接的数据

flyn:我使用这个库加载若干网络图片,但是这些图片的直链需要从 RESTful API + 对应 hash 返回的 JSON 中获取。请教一下大佬们,如何才能让 SDWebImage 实时获取图片的直链(获取直链的 JSON 中有一些额外的参数需要保存并参与缓存管理)?

如何在.NET中安装Windows服务? - c#

我已经在.Net 2.0(C#)中创建了一个控制台应用程序,并希望创建一个将应用程序作为Windows服务安装的安装程序。我以前从未创建过安装程序,但正在阅读有关该主题的几篇文章。我将不胜感激那些在这方面有经验的人的任何建议或链接。谢谢。更新:我目前正在研究http://justinjmoses.wordpress.com/2008/03/27/visual…

如何在.NET中制造一个空字符串? - c#

我写了一段优化的代码,其中包含null和空字符串的特殊情况。我现在正在尝试为此代码编写单元测试。为此,我需要两个空的(零长度)字符串对象,它们是不同的对象。像这样:string s1, s2; Assert.IsTrue(s1.Length == 0 && s2.Length == 0); Assert.IsTrue(!ReferenceEq…

如何在 Pandas 数据框中执行不同值的累加总和 - python

我有一个这样的数据框:id date company ...... 123 2019-01-01 A 224 2019-01-01 B 345 2019-01-01 B 987 2019-01-03 C 334 2019-01-03 C 908 2019-01-04 C 765 2019-01-04 A 554 2019-01-05 A 482 2019-0…

如何在.NET中引用特定的基类方法? - c#

在.NET中,我试图猴子修补第3方库。我创建了一个新类Grandchild,该类继承自Parent派生的Child类。在孙子项的替代方法中,我需要跳过“子项”并调用“父项”。那可能吗?换句话说,我想做:public class Grandchild : Child { public void override MyMethod() { // illegal …