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

本文关键字:泛型 这种情况下 为什么 | 更新日期: 2023-09-27 18:24:23

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 社区询问为什么其他人的代码以某种方式读取可能是一种糟糕的提问方式,但这是在许多文章和教程中发现的一种非常标准的帮助程序方法,所以我希望这种方法是公认的方法。

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

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

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

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