有什么方法可以實作,interface ISetter以便在分配值時不需要裝箱?直接轉換(T)value顯然是不可能的(編譯器錯誤)。型別T可以是值或型別別。在interface ISetter它應該在一個共同的字典不同型別被用作值型別不能為通用本身T。
public interface ISetter
{
void Set<T>(T value);
}
public class Prop<T> : ISetter
{
public T Value;
//will be called always matching T1 == T
public void Set<T1>(T1 value)
{
if (typeof(T1) != typeof(T)) throw new ArgumentException();
Value = (T)(object)value; //is there any way to avoid boxing
}
}
uj5u.com熱心網友回復:
據我所知,它實際上不應該裝箱傳遞的值。的每一個組合T和T1其中兩個是如此編譯器有能力,導致在去除“中間”澆鑄到的碼的優化零件值型別應該被單獨編譯object。
下一個基準測驗(使用BenchmarkDotNet)顯示我的機器上沒有分配(TargetFramework - 安裝了最新 SDK 的 netcoreapp3.1):
[SimpleJob(RunStrategy.Monitoring)]
[MemoryDiagnoser]
public class BenchBoxedNonBoxedGeneric
{
private static Prop<int> GenericProp = new();
private static Prop NonGenericProp = new();
private const int Iterations = 1000_000_000;
[Benchmark]
public int NonGeneric()
{
for (int i = 0; i < Iterations; i )
{
NonGenericProp.Set(i);
}
return NonGenericProp.Value;
}
[Benchmark]
public int Generic()
{
for (int i = 0; i < Iterations; i )
{
GenericProp.Set(i);
}
return GenericProp.Value;
}
}
public class Prop<T>
{
public T Value;
public void Set<T1>(T1 value)
{
Value = (T)(object)value;
}
}
public class Prop
{
public int Value;
public void Set(int value)
{
Value = value;
}
}
| 方法 | 意思 | 錯誤 | 標準差 | 已分配 |
|---|---|---|---|---|
| 非通用 | 405.2 毫秒 | 26.76 毫秒 | 17.70 毫秒 | —— |
| 通用的 | 383.2 毫秒 | 21.37 毫秒 | 14.14 毫秒 | —— |
該反編譯,以JIT ASM與sharplab.io似乎證明了這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/363826.html
