Laden...

Alias/Referenz auf Werttyp

Erstellt von gelöschtem Konto vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.295 Views
Thema geschlossen
Gelöschter Account
vor 12 Jahren
Alias/Referenz auf Werttyp

Hallo,

in einem Algorythmus wird ein zweidimensionales Array eines Werttyps (eine Enumeration) iteriert.
Innerhalb der doppelten Schleife müsste ich dann den Ausdruck "array[x][y]" verwenden. Da der Name etwas länger ist (eigentlich nicht "array") will ich den nicht jedes Mal neu tippen oder kopieren.

Wenn ich folgendes schreibe, wird der Wert aber kopiert.

typ kurzName = array[x][y];

Ich brauche aber eine Referenz (bzw. "Alias") darauf, damit der Wert im Array auch geändert wird.
Das ist eigentlich eine Grundlagenfrage, trotzdem habe ich auch nach einiger Sucherei nichts gefunden. "Boxing" scheint mir nicht der richtige Weg zu sein. Gibts dazu eine elegante Lösung? oder Copy+Paste?

MfG janismac

C
1.214 Beiträge seit 2006
vor 12 Jahren

Eine Enumeration wirst du noch schneller kopieren können, als eine Referenz. Enums werden wohl 4 Byte brauchen, Referenzen unter .NET 12 Byte.

5.742 Beiträge seit 2007
vor 12 Jahren

Da der Name etwas länger ist (eigentlich nicht "array") will ich den nicht jedes Mal neu tippen oder kopieren.

Zwei Möglichkeiten:1.Nimm einen kürzeren Namen 1.Schreibe eine Methode, die den Zugriff erledigt

Gelöschter Account
vor 12 Jahren

Es geht mir nicht um Performance, sondern um die Geschwindigkeit beim Programmieren.

Und das eigentliche Problem ist nicht der lange Arrayname (dafür gibts ja IntelliSense), sondern der Index "[x][y]".
Um den einzutippen brauch ich mindestens so lange wie für copy+paste. Gut, das ist kein tragisches Problem, man könnte damit leben 😄. Aber, wenn es eleganter geht, warum nicht?

C
1.214 Beiträge seit 2006
vor 12 Jahren

Ich brauche aber eine Referenz (bzw. "Alias") darauf, damit der Wert im Array auch geändert wird.

Das habe ich überlesen, sorry. Das geht dann nicht. Auch Boxing bringt es dir nichts, weil das ist dann auch nur eine Kopie, verpackt in ein Objekt.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo janismac,

dann schreib doch:


T[][] myArray = ....
for (int i = 0; i < myArray.Lenght; ++i)
{
    T[] tmp = myArray[i];

    for (int j = 0; j < tmp.Length; ++j)
    {
        T value = tmp[j];
    }
}

Ist sogar von der Performance her besser, da in der inneren Schleife Range-Check-Elimination angewandt werden kann, allerdings wirkt sich dies nur bei sehr vielen Schleifendurchläufen aus und es sollte "premature optimization is the root of all evil" (Donald E. Knuth) bedacht werden.

Hallo Coder007,

Referenzen unter .NET 12 Byte.

Referenzen brauchen 4 Byte auf 32bit-Systemen und 8 Byte auf 64bit-Systemen. Für die Objektgröße schauts anders aus (klar, je nach Größe). Für Arrays hab ich Arrays initialisieren etwas dazu geschrieben.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Gelöschter Account
vor 12 Jahren

Bleibt das Problem dabei nicht bestehen?
Also wenn ich das so weiterführe:


T[][] myArray = ....
for (int i = 0; i < myArray.Lenght; ++i)
{
    T[] tmp = myArray[i];

    for (int j = 0; j < tmp.Length; ++j)
    {
        T value = tmp[j];
        value = 123;
    }
}
Console.Write(myArray[0][0]);

Dann steht die "123" in "value", aber nicht in "myArray[0][0]". Werttypen werden doch kopiert. Oder?

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo janismac,

Werttypen werden doch kopiert. Oder?

Ja, so ist es. Schreib halt


tmp[j] = 123;

Bei normalen int schreibst du es ja auch nicht anders. Wenn du das nicht willst, musst du es durch ein Objekt kapseln (1. Klasse mit Eigenschaft vom Typ T, 2. Interface od. 3. den Werttyp durch einen Referenztyp ersetzen, siehe auch Boxing/Unboxing: Es wird in Büchern immer erwähnt, aber welchen Vorteil bringt es mit sich?), aber da ist wohl der Aufwand noch höher.
Du kannst dir auch ein Snippet für VS erstellen od. für tmp eine noch kürzere Bezeichnung wählen, achte aber auf die Lesbarkeit vom Code.

Jetzt sind wir aber bei den Grundlagen angelangt. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Thema geschlossen