gpt4 book ai didi

c# - 如何在不装箱/拆箱的情况下处理已知的通用类型

转载 作者:行者123 更新时间:2023-12-05 01:22:21 24 4
gpt4 key购买 nike

我有一个处理大量不同类型数据的通用方法。

当数据是特定类型时(在本例中为 double),我想应用一些额外的处理。不同类型的所有其他功能都是相同的。

有没有比下面示例中所示的(非常慢的)装箱/拆箱更好的方法?

这似乎意味着我们需要在 if..else 中让编译器相信 Tdouble 是同一类型断言这一点的部分。

public static T[] HalfIfDouble<T>(T[] data)
{
T[] result;

if (typeof(T) == typeof(double))
{
// result = data.Select(x => x * 0.5).ToArray(); // does not compile

result = data.Select(x =>
{
double d = (double)(object)x;
return (T)(object)(d * 0.5);
}).ToArray();
}
else
{
result = data;
}

// do some more processing...

return result;
}

真正的功能显然比这个例子要复杂。

需要在 .NET Framework 和 .NET 6 中工作。

最佳答案

您可以使用 as operator进行转换而不是 (T)

  • 在表达式 value as T 中,如果可能,它将尝试将 value 转换为 T 类型,否则该值为
  • as 仅在转换为引用类型(在您的情况下为数组)时可用。

您还可以使用 is operator替换类型检查。

  • 在表达式 value is T 中,如果 value 可以转换为类型 T,则表达式为真。
  • 在表达式 value as T tValue 中,如果 value 可以转换为类型 T 和变量 ,则表达式为真>tValue 将被分配 (T)value 的值。

使用我们得到的这些运算符更新您的代码:

  • 如果在 .Net Framework 或 .Net 中禁用可为空的引用类型:
public static T[] HalfIfDouble<T>(T[] data)
{
T[] result;

if (data is double[] da)
{
result = da.Select(x => x * 0.5).ToArray() as T[];
}
else
{
result = data;
}

// do some more processing...

return result;
}
  • 如果在 .Net 中启用了可为空的引用类型:
  • 这使用了 null-forgiving operator !告诉编译器 as T[] 永远不会返回 null
    • 启用可为空的引用类型时,as T[] 会导致 T[]?,因为如果转换失败,则结果为 null
    • 我们知道它不会导致 null 因为我们知道 Tdouble 来自 data is double[] 这样我们就可以安全地使用它了。
public static T[] HalfIfDouble<T>(T[] data)
{
T[] result;

if (data is double[] da)
{
result = (da.Select(x => x * 0.5).ToArray() as T[])!;
}
else
{
result = data;
}

// do some more processing...

return result;
}

关于c# - 如何在不装箱/拆箱的情况下处理已知的通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74301435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com