代码之家  ›  专栏  ›  技术社区  ›  Joseph Hales

C#通用对象函数指针,相同地址?

  •  3
  • Joseph Hales  · 技术社区  · 7 年前

    我试图获取泛型类中方法的函数指针。我一直在使用MethodInfo。MethodHandle。GetFunctionPointer()这样做,但由于我最近一直在处理泛型类,上述方法学一直按照我所认为的方式工作。

    考虑以下因素:

    public class Example<T>
    {
        public bool doSomething()
        {
            /*some work*/
            return true;
        }
    }
    

    以下全部返回相同的内存地址:

    typeof(Example<int>).GetMethod("doSomething").MethodHandle.GetFunctionPointer()
    typeof(Example<bool>).GetMethod("doSomething").MethodHandle.GetFunctionPointer()
    typeof(Example<SomeClass>).GetMethod("doSomething").MethodHandle.GetFunctionPointer()
    

    我不知道为什么会这样。谁能给我解释一下吗?内存中真的只有一个版本的函数吗?

    这肯定会引起一些关注。我正在修改游戏的代码,但无法访问源代码。这种方式注入代码是这一行的常见做法。只要不直接修改原始dll文件,游戏的EULA也特别允许这种注入。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Evk    7 年前

    那是因为 article Anders Hejlsberg(首席建筑师):

    现在,我们接下来要做的是对所有具有值的类型实例化 类型如 List<int> ,则, List<long> ,则, List<double> ,则, List<float> 我们 创建可执行本机代码的唯一副本。所以 列表(<);内部(>); 获取 它自己的代码。 列表(<);长(>); 获取其自己的代码。 列表(<);浮动(>); 拥有自己的 密码对于所有引用类型,我们共享代码,因为它们是 代表性相同。这只是指针。

    在您的示例中, bool int 是值类型。他们每个人都有自己的副本,因此他们有不同的指向 doSomething SomeClass 是引用类型(我假定)。因此,它与其他引用类型共享其代码,但不与值类型共享。所以它也有不同的 剂量测定法 指针(不同于 布尔 内景 版本)。如果使用其他引用类型( SomeOtherClass )-其指针与 SomeClass类 版本 剂量测定法