Nachteile von C#
-
Hallo,
programmiere gerade in C# und ärgere mich gerade über zwei Dinge. Vielleicht ist es ja auch nur meine Unwissenheit
1. Schade, dass man die Funktionsparameter nicht const oder readonly übergeben kann
2. Leider ist das Argument der indexer (also []) immer int und nicht wie das halt die Natur eines Indexes ist uintWäre froh wenn ich bei einem der Punkte nur etwas falsch mache. Ansonsten wüßte ich gern ob ich der Einzige bin, den das stört!?
-
(1) Die const-Semantik wie in C++ gibt es in C# nicht. Stattdessen macht man oft readonly-Wrapper, die nur Leseoperationen erlauben. Meistens muss man nur sein Design etwas ändern und dann ist es trotzdem ganz geil. Bring doch mal ein Beispiel, wo es dich konkret stört, dann finden wir vielleicht eine akzeptable Lösung. Natürlich gibt es schon auch Fälle, wo ein const wünschenswert wäre, besonders wenn es dort auf die Performance ankommt. Aber recht oft findet man gute andere Lösungen.
(2) Indexer können von jedem beliebigen Typ sein auch z.B. von Typ DateTime. Auch auf ein Array kann mit uints oder gar ulongs zugegriffen werden. Deshalb verstehe ich wirklich nicht, was du meinst.
-
Schön dass doch noch jemand Antwortet.
zu 1)
Readonly Wrapper ist für mich ein neuer Begriff, aber ich kann mir vorstellen, dass man damit schon was anfangen kann. Das ist sicherlich eine Möglichkeit. Wenn ich aber jemanden für eine Funktion eine Eingabe mitgeben will dann würde ich schon gerne verhindern, dass der Wert verändert wird.zu 2)
Ich meinte die Container der System.Collection assembly. Die haben als Index einen int verwendet. Das finde ich zumindest unglücklich.und jetzt noch einen weiteren Punkt.
- Gibt es denn keine Art typedef in C#. In Kombination mit gerenics würde das ja zu nichtssagenden typen führen.
Oder macht man das dann einfach so?
class ListOfStrings : List<string> {}
- Gibt es denn keine Art typedef in C#. In Kombination mit gerenics würde das ja zu nichtssagenden typen führen.
-
templäd schrieb:
Schön dass doch noch jemand Antwortet.
3) Gibt es denn keine Art typedef in C#. In Kombination mit gerenics würde das ja zu nichtssagenden typen führen.
Oder macht man das dann einfach so?class ListOfStrings : List<string> {}
using ListOfStrings = List<string>
-
templäd schrieb:
zu 2)
Ich meinte die Container der System.Collection assembly. Die haben als Index einen int verwendet. Das finde ich zumindest unglücklich.Aus den Beispielen im MSDN:
Dictionary<string, string> openWith = new Dictionary<string, string>(); ... openWith["doc"] = "winword.exe";
-
nn schrieb:
Aus den Beispielen im MSDN:
Dictionary<string, string> openWith = new Dictionary<string, string>(); ... openWith["doc"] = "winword.exe";
Naja natürlich könnte ich mir einnen assoziativen Kontainer mit uint basteln, aber das geht nicht.
List<string> test; test.Add(""); uint index = 0; test[index] = "";
PS: danke für den
using
Hinweis
-
Was du da ansprichst ist eine Design-Sache mit den Collections in .Net, nicht mit C#. Man hat die Collections so gemacht, weil es Sprachen gibt, die keine unsigned-Datentypen kennen und mit diesen soll man die Collections-Lib auch benutzen können. Generell finde ich unsigned-Typen nicht so wahnsinnig wichtig und auch nicht, dass man mit ihnen indiziert. Warum genau stört dich das jetzt so krass?
zu 1)
Readonly Wrapper ist für mich ein neuer Begriff, aber ich kann mir vorstellen, dass man damit schon was anfangen kann. Das ist sicherlich eine Möglichkeit. Wenn ich aber jemanden für eine Funktion eine Eingabe mitgeben will dann würde ich schon gerne verhindern, dass der Wert verändert wird.Wie gesagt, da muss man für den Einzelfall Lösungen suchen.
const in C++ lässt einen Typen sich je nach Kontext unterschiedlich verhalten. Einen solchen Mechanismus gibt es in C# nicht, stattdessen spezifiziert man über den Typ, welche Operationen möglich sein sollen.
Wenn du beispielsweise ein Array von Tieren an eine Funktion übergeben sollst, die nur die Tiere auf der Kommandozeile ausgibt, dann ist schon was schiefgelaufen. Der Funktion würde es völlig reichen, ein IEnumerable<Tier> zu erhalten und mehr Anforderungen sollte sie an den Parameter auch nicht stellen. Man sollte immer nur die Mindestanforderung an den Parameter spezifizieren. Mit nem Array spezifizierst du random write-access, weil dieser Typ diese Funktionalität eben bereitstellt. Wenn du nicht willst, dass sie zur Verfügung steht oder nötig ist, dann gibst du das Array als was allgemeineres weiter, zum Beispiel als IList<Tier> oder IEnumerable<Tier> (beides wird von Tier[] implementiert).
Also Fazit: Die Typisierung in der Schnittstelle entscheidet, welche Operationen möglich sind. Dementsprechend musst du den richtigen Typ aussuchen. Dabei musst du nicht notwendigerweise dein Objekt erst wrappen, zum Beispiel implementiert ein Array schon IEnumerable<T> und IList<T>.