带有泛型类型参数的C#类的实例在什么时候会失去对其;“通用”-海角?

带有泛型类型参数的C#类的实例在什么时候会失去对其;“通用”-海角?,c#,generics,clr,bytecode,machine-code,C#,Generics,Clr,Bytecode,Machine Code,我确信答案已经有十种形式了,但不幸的是,我不知道如何形成这个问题 如果我使用泛型类型参数创建一个类: public class GenericClass<TTypeParam> where TTypeParam : class { public TTypeParam InstanceOfTypeTTypeParam { get; set; } public override string ToString() { return (t

我确信答案已经有十种形式了,但不幸的是,我不知道如何形成这个问题

如果我使用泛型
类型
参数创建一个类:

public class GenericClass<TTypeParam> where TTypeParam : class
{
     public TTypeParam InstanceOfTypeTTypeParam { get; set; }

     public override string ToString()
     {
          return (this.InstanceOfTypeTTypeParam == null) ? string.Empty : this.InstanceOfTypeTTypeParam.ToString();
     }
}
公共类GenericClass,其中TTypeParam:class
{
公共TTypeParam实例OfTypeTTypeParam{get;set;}
公共重写字符串ToString()
{
return(this.InstanceOfTypeTTypeParam==null)?string.Empty:this.InstanceOfTypeTTypeParam.ToString();
}
}
然后在某处使用它:

public static void Main()
{
    var instance = new GenericClass<string>();
    System.Diagnostics.Debug.WriteLine(instance.ToString());
}
publicstaticvoidmain()
{
var实例=新的GenericClass();
System.Diagnostics.Debug.WriteLine(instance.ToString());
}
为了更好地理解.NET运行时背后的机制,我有兴趣了解:

  • 编译器是否创建了一个具体的非泛型类
    GenericClass`string
    ,因为它知道我在某处实例化了一个
  • 如果不是,则当进程开始运行时,运行时是否将
    GenericClass
    编译为“real”类
  • 如果不是的话,
    GenericClass
    在什么时候会变成一个愚蠢的CPU可以理解的东西
  • 如果在运行时发生这种情况,.NET运行时是否会以某种方式“缓存”它为解决此问题所做的工作
  • 这是一种可在每个类、每个程序集或其他基础上配置的行为吗?还是不可配置?(即,如果默认行为是在需要的时候做,你能要求它提前做这项工作吗?反之亦然?)
  • 如果它发生在每次调用之前,我会认为这可能会带来一些开销,而且有时很难预测将一些高级
    .NET
    指令转换为实际指令的困难

    我还想知道,如果编译器对泛型类型使用的所有排列进行静态分析(如果1为真),那么它是否也对泛型方法进行同样的分析


    如果您有时间,我将非常感谢您能为我提供这些概念的正确术语(在我缺少的地方)。

    应该能回答您的大部分问题。@YuvalItzchakov谢谢,这几乎是完美的-只是它不能回答是否可以要求编译器提前完成工作。我的意思是,这可能是一个真正的边缘情况,但至少在理论上似乎是可能的-它可以悄悄地预先打包所有可能的排列(不包括反射的排列),然后就不需要为这个特定场景进行及时编译了。。。对吗?你不能要求编译器“预先”创建具体的泛型类型。这就是运行时的工作(正如当前实现的那样)。有一种方法可以做到这一点,那就是重新编译程序集,这将导致IL代码向下编译为本机代码,在那里您将看到具体的类型。我只是想,也许是这样,因为运行时似乎能够通过泛型类和参数缓存以前的编译,所以有一些机制可以在运行时重用它,