C# 避免拳击和拳击;泛型类中的拆箱
下面是一些快速代码来说明我的问题。有没有办法避免这种显然不必要的装箱/拆箱C# 避免拳击和拳击;泛型类中的拆箱,c#,generics,boxing,unboxing,C#,Generics,Boxing,Unboxing,下面是一些快速代码来说明我的问题。有没有办法避免这种显然不必要的装箱/拆箱 public class TestClass<T> { public T TestMethod() { if (typeof(T) == typeof(bool)) { return true; // doesn't work return (T)(object)true; // works, but any way to avoid this? }
public class TestClass<T>
{
public T TestMethod()
{
if (typeof(T) == typeof(bool))
{
return true; // doesn't work
return (T)(object)true; // works, but any way to avoid this?
}
return default(T);
}
}
公共类TestClass
{
公共测试方法()
{
if(typeof(T)=typeof(bool))
{
return true;//不起作用
return(T)(object)true;//有效,但有什么方法可以避免这种情况吗?
}
返回默认值(T);
}
}
这是处理此处操作的唯一方法(返回特定封闭泛型类型的非默认值)。将其设置为静态字段
public class TestClass<T>
{
static T TrueIfBoolean = typeof(T) == typeof(bool) ? (T)(object)true : default(T)
public T TestMethod()
{
return TrueIfBoolean;
}
}
公共类TestClass
{
静态T TrueIfBoolean=typeof(T)==typeof(bool)?(T)(对象)true:默认值(T)
公共测试方法()
{
返回TrueIfBoolean;
}
}
这样,装箱/拆箱只发生一次。即使在初始代码中,这种优化也完全有可能由运行时完成。泛型表示“同一代码适用于多种类型”。对于不同的类型,您需要不同的代码,因此您的用例不在泛型的关注范围内。如果您只是想检查方法主体中的类型,为什么要首先将其设置为泛型?是否.NET运行时没有对此进行优化?@dtb,@Servy:这类似于LINQ的
Cast(此IEnumerable源代码)
,但是有一些自定义情况,例如“Y”/“N”,需要手动转换为真/假。如果bool是我自己的类型,我可以使用显式运算符。所有其他类型都是泛型处理的。@TravisGockel:这很可能是真的,但它只能对泛型的TestClass
版本执行。这是我的想法,因为编译时不知道T,但我想我会试试。:)我认为编译器不允许优化从值类型到对象的转换。另一方面,如果演员阵容只发生一次,浪费的时间将是一个非因素。