C# 为什么在这种情况下使用泛型?

C# 为什么在这种情况下使用泛型?,c#,generics,object,serialization,methods,C#,Generics,Object,Serialization,Methods,我理解,询问SO社区为什么其他人的代码以某种方式读取可能是一种不好的提问方式,但这是在许多文章和教程中发现的一种非常标准的帮助方法,因此我希望这种方法是一种公认的方法。这只是为了让您不必使用GetType()获取DataContractJsonSerializer的T类型。它还停止值类型的装箱。这只是为了不必使用GetType()来获取DataContractJsonSerializer的t类型。它还停止值类型的装箱。原因是优化。当某个函数是泛型函数时,编译器将生成与调用中使用的不同类型相同数量

我理解,询问SO社区为什么其他人的代码以某种方式读取可能是一种不好的提问方式,但这是在许多文章和教程中发现的一种非常标准的帮助方法,因此我希望这种方法是一种公认的方法。

这只是为了让您不必使用
GetType()
获取
DataContractJsonSerializer
T
类型。它还停止值类型的装箱。

这只是为了不必使用
GetType()
来获取
DataContractJsonSerializer
t
类型。它还停止值类型的装箱。

原因是优化。当某个函数是泛型函数时,编译器将生成与调用中使用的不同类型相同数量的该函数实例。这意味着每个特定的实例化将知道其确切类型,并启用特定于参数类型的优化,例如:32位算术而不是64位,避免不必要的装箱,调用非虚拟方法等


JsonSerializer(T)
的这种特殊情况下,增益可能不会太大。一般来说,特别是当函数被调用数百万次时,签名中的这种复杂化带来的收益是值得的。

原因是优化。当某个函数是泛型函数时,编译器将生成与调用中使用的不同类型相同数量的该函数实例。这意味着每个特定的实例化将知道其确切类型,并启用特定于参数类型的优化,例如:32位算术而不是64位,避免不必要的装箱,调用非虚拟方法等



JsonSerializer(T)
的这种特殊情况下,增益可能不会太大。一般来说,特别是当函数被调用数百万次时,签名中的这种复杂情况的增益可能是值得的。

可能对于
typeof(T)
?这是一种获取变量声明类型的方法。但是我在impression对象下。GetType()可以代替它吗?谢谢你的回复。是的,但是
typeof(T)
是在编译时解析的,而
GetType()
是在运行时解析的。@CédricBignon那又怎样?@delnan所以,它稍微快一点。没有别的了。我不相信在这种情况下会有什么不同。可能对于
typeof(t)
?这是一种获取变量声明类型的方法。但是我在impression对象下。GetType()可以代替它吗?谢谢你的回复。是的,但是
typeof(T)
是在编译时解析的,而
GetType()
是在运行时解析的。@CédricBignon那又怎样?@delnan所以,它稍微快一点。没有别的了。我不相信在这种情况下会有什么不同。但是我在impression对象下。GetType()可以代替这个吗?谢谢你的回答。确保你也理解了答案的第二部分。您可以对值类型(如
int
)使用泛型方法,而无需将其装箱到对象中。@Alden-这是我现在很难理解的答案的第二部分。我说的对吗?如果在这个场景中,您将int作为t传递,并且它希望得到一个对象,那么它会将int(值类型)作为对象(引用)装箱,然后将这个“装箱”对象传递给WriteObject方法,而它本可以“直接”作为int传递?再次感谢所有回复。到目前为止非常有用。在这种情况下,它最终还是会被装箱,因为WriteObject将对象作为第二个参数。所以我想唯一的优化就是编译时typeof()。但是,一般来说,可以将值类型作为泛型参数传递,而不必对其进行装箱?谢谢你的回答。确保你也理解了答案的第二部分。您可以对值类型(如
int
)使用泛型方法,而无需将其装箱到对象中。@Alden-这是我现在很难理解的答案的第二部分。我说的对吗?如果在这个场景中,您将int作为t传递,并且它希望得到一个对象,那么它会将int(值类型)作为对象(引用)装箱,然后将这个“装箱”对象传递给WriteObject方法,而它本可以“直接”作为int传递?再次感谢所有回复。到目前为止非常有用。在这种情况下,它最终还是会被装箱,因为WriteObject将对象作为第二个参数。所以我想唯一的优化就是编译时typeof()。但是,通常情况下,您可以将值类型作为泛型参数传递,而无需对其进行装箱?我没有看到任何从
t
调用的虚拟方法,并且由于
ser.WriteObject(Stream,object)
的原因,在所有情况下都会出现装箱。非常感谢,伙计,感谢你的回答。在这种特殊情况下?我没有看到任何从
t
调用的虚拟方法,因为
ser.WriteObject(Stream,object)
,所以在所有情况下都会出现装箱。非常感谢,伙计,感谢你的回答。
public static string JsonSerializer<T>(T t)
{
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
    MemoryStream ms = new MemoryStream();
    ser.WriteObject(ms, t);
    string jsonString = Encoding.UTF8.GetString(ms.ToArray());
    ms.Close();
    return json;
}
public static string JsonSerializer(object t)...