typedef in C#
-
Hallo,
wie realisiert man einen Typedef in C#? Beispiel, ich habe eine Klasse mit float, will diese aber nun auf double umstellen und mir auch einen späteren Wechsel frei halten. Gegen das einsetzten eines konkretene Typs und Search/Replace spricht ausserdem, dass nicht alle Stellen wo float genutzt wird geändert werden sollen. Zusätzlich wird die Klasse in verschiedenen Files genutzt und dort sollen die Änderungen auch angewendet werden. Was mit der einfachen Anwendung eines Alias nicht möglich ist. Auch kann man einen Alias nur auf Klassen/Strukturen setzten, was ich aus Performance-Gründen unvorteilhaft finde. Eine Erläuterung zu den Performancebedenken, die das Gegenteil bezeugen, wäre ich auch nicht abgeneigt.
Danke und Gruß!
-
Es gibt kein typedef in C#, so wie man es aus C++ kennt.
Dir bleibt nur die Möglichkeit, deinen Typ in einer Wrapperklasse zu kapseln.Edit: Was es gibt sind spezielle using-Direktiven für Generics, die allerdings auf das momentane Sourcefile begrenzt sind und daher überall wiederholt werden müssen. Bringt dir aber für deinen Anwendungsfall nichts.
-
Danke schonmal für die Antwort. Wie würde den so eine Wrapperklasse aussehen?
-
Es kommt darauf an. Da du Werttypen kapseln willst, sollte sie auch Wertsemantik bieten, also ein struct sein. Dann sieht das so aus:
struct FloatingPointWrapper { private float internalValue; public FloatingPointWrapper(float f) { this.internalValue = f; } public float Val { get { return this.internalValue; } set { this.internalValue = value; } } }
Du bist dann immer noch über den Konstruktor des Wrappers etwas an den eigentlichen Datentyp gebunden.. aber irgendeinen Tod wirst du sterben müssen. Ich würd's aber dennoch nicht machen, sondern mich auf einen Datentyp festlegen und dabei auch zukünftige Entwicklungen berücksichtigen.
-
Und wenn du statt den FloatingPointWrapper einen Wrapper mit Generic anwendest? Da kannst du ja den Generic bei bedarf einfach tauschen.
-
Nein das nützt mir soweit nichts. Prinzipiell würden sich bei dem Problem Generics anbieten, die werden aber erst zur Laufzeit aufgelöst, was an anderen Stellen zu Problemen führt. Auf einen Datentyp festlegen ist aber im vorliegenden Fall nicht möglich.
Ich hab das erstaml so gelöst, das ich einen Parameter mitgebe. Nach außen hin kann ich so weiterhin double verwenden und intern muss ich eine Fallunterscheidung machen.
-
Fedaykin schrieb:
Und wenn du statt den FloatingPointWrapper einen Wrapper mit Generic anwendest? Da kannst du ja den Generic bei bedarf einfach tauschen.
Bedenke dass du dann immer mit dem generischen ValueTypeWrapper<T> arbeiten müsstest, da für structs keine Vererbung möglich ist. D.h. FloatingPointWrapper : ValueTypeWrapper<float> kannst du knicken.
Man müsste gerade Komposition verwenden.. und das ist alles anderes als optimal.
-
using myNumberType = System.Single;
bzw.
using myNumberType = System.Double;Muss pro Übersetzungseinheit vorliegen.
-
usingdef schrieb:
Muss pro Übersetzungseinheit vorliegen.
Und der Punkt ist extrem Fehlerträchtig. Deswegen wäre der Weg über einen eigenen Typ vorzuziehen. Hat aber andere Nachteile, die auch schon genannt wurden.
-
Ich würde einfach refactoren