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

时间:2013-07-23 16:44:18

标签: c# generics object serialization methods

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;
}

以上是典型的json辅助方法。 <T>的相关性以及将参数作为类型T传递的相关性是什么?

鉴于所有对象都从object继承,我希望这个方法签名可以读取:

public static string JsonSerializer(object t)...

我很感激,向SO社区询问为什么其他人的代码会以某种方式读取,这可能是一种不好的质疑,但这是许多文章和教程中发现的非常标准的辅助方法,所以我期待这种方法是那样的被接受的人。

2 个答案:

答案 0 :(得分:4)

这样,您就不必使用GetType()来获取T的{​​{1}}类型。它还会停止为值类型装箱。

答案 1 :(得分:3)

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

JsonSerializer<T>(T t)的特殊情况下,收益可能不会那么大。一般来说,特别是当函数被称为数百万次时,这种复杂性在签名中非常值得。