Próbuję pisać klasy, które obsługują różne typy liczb. Wiem, że C# (i .NET w ogóle, wierzę) ma INumber
interfejs, więc nie mogę używać coś jak następuje:Jak mogę napisać pojedynczą klasę, aby kompilować wiele razy z różnymi typami liczb?
public class Adder<T> where T:INumber
{
public T Add(T a, T b)
{
return a + b;
}
}
To w porządku, chociaż, bo chciałbym uniknąć boks/rozpakowywanie każdej z moich liczb. Mogłem jednak użyć kompilacja warunkowa dla każdego rodzaju chcę wspierać:
#if FLOAT
public class AdderF
{
public float Add(float a, float b)
#else
public class Adder
{
public int Add(int a, int b)
#endif
{
return a + b;
}
}
Oznacza to będę musiał skompilować inny Library.dll
i LibraryF.dll
jednak. Czy jest jakieś bardziej eleganckie rozwiązanie?
Oczywiście w moim przykładzie mogę po prostu napisać kod dwukrotnie. Chciałbym jednak użyć tego procesu, aby stworzyć duże skomplikowane struktury danych z wersją całkowitą i zmiennoprzecinkową, więc nie chcę mieć możliwości kopiowania i wklejania błędów podczas aktualizacji mojej struktury. Nie chcę też, aby utrata prędkości powodowała owijanie struktury zmiennoprzecinkowej w integralnym opakowaniu i niepotrzebne przekształcanie wszystkich danych wejściowych w bardziej łagodny typ danych.
Tak jak powiedziałem, staram się poprawić wydajność moich struktur danych. t Myślę, że użycie 'decymalnej' wszędzie, gdzie mógłbym użyć 'int' zamiast tego byłoby na to skuteczne. T4 to zdecydowanie fajna technologia, o której nie wiedziałem i na pewno się nią zajmie! – dlras2