Entwickler-Ecke

Basistechnologien - Speicher Alloc. von strings in switchblock


Nuckey - Mo 30.05.11 18:24
Titel: Speicher Alloc. von strings in switchblock
also Frage: wie intelligent verwaltet C# string o. Zeichenketten in switchblöcken.
folgendes beispiel.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
static public void TestFnc(string txt)
{

    switch(txt)
    {
      case "test0"break;
      case "test1"break;
      case "test2"break;
    }
}

werden die strings hier nur einmal im speicher erzeugt oder wird jedesmal beim aufruf der methode die strings neu generiert zb.: aufn stack ?

und wäre hier statische oder const. strings besser ?

mfg nuckey

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Ralf Jansen - Mo 30.05.11 19:16

Zitat:
werden die strings hier nur einmal im speicher erzeugt oder wird jedesmal beim aufruf der methode die strings neu generiert zb.: aufn stack ?


Aufgrund des string interning [http://msdn.microsoft.com/de-de/library/z5th00wc(v=VS.100).aspx] gibt es jeden String eigentlich nur einmal. Die Frage erübrigt sich dann eigentlich.

Zitat:
und wäre hier statische oder const. strings besser ?


An dieser Stelle sind nur Konstanten erlaubt. Ist daher egal wo du denn herholst macht im CIL keinen Unterschied. Orientier dich also bei deiner Wahl an Lesbarkeit und nicht an irgendeiner theoretischen Optimierbarkeit.


Nuckey - Mo 30.05.11 19:32

danke ralf ,habe dehn link kurz überflogen (genaures studium später),um es für mich verständlich zu machen.

egal wie oft die methode aufgerufen wird,behält C# die strings im speicher und dehmentsprechend wäre das einsetzen von const strings sinnfrei.

mfg nuckey


Kha - Mo 30.05.11 19:41

Grundsätzlich kann ich mich Ralfs Schlusssatz nur anschließen, nur noch eine Anmerkung:
user profile iconNuckey hat folgendes geschrieben Zum zitierten Posting springen:
oder wird jedesmal beim aufruf der methode die strings neu generiert zb.: aufn stack ?
Referenztypen werden nie auf dem Stack abgelegt.


Ralf Jansen - Mo 30.05.11 20:08

Zitat:
egal wie oft die methode aufgerufen wird,behält C# die strings im speicher und dehmentsprechend wäre das einsetzen von const strings sinnfrei.


Die Erkenntnis ist richtig die Begründung aber nicht. Beim Compilieren würde die Konstante die du im Case referenzierst durch das Literal das hinter der Konstante steckt ersetzt. Der CIL Code wäre absolut identisch egal ob du das Literal direkt benutzt oder da eine Konstante einsetzt.