[C#] Șir de caractere literal: linie-nouă și ghilimele (via Dot Net Perls)


Șir de caractere literal (en. String literal). Acesta constă în date constante sub forma unui șir de caractere. Datele șir de caractere sunt create în moduri diferite. Noi folosim literalele ca argumente la metode, sau oriunde un șir de caractere este cerut.

Cu un șir de caracter literal, caracterele sunt stocate direct în metadate. Mai puține ocoluri (care reduc performanța) sunt necesare.

Acest program conține șiruri de caractere literale. Șirurile de caractere literale la nivel de clasă sunt reprezentate ca referințe static sau const. Cele la nivel de metodă sunt tratate separat în metadate.
Static [EN]

Apoi:
Programele demonstrează literalele. Are caractere linie-nouă, tab-uri și ghilimele în literali.

Linii noi:
Acestea sunt specificate fie cu "\r\n" sau doar "\n". Și tab-urile sunt specificate cu "\t".

Ghilimelele:
Pentru ghilimele, noi folosim deseori un „backslash” (bară oblică înclinată spre stânga: "\"), dar pentru un literal textual (en. „verbatim”) (prefixat cu @), noi folosim două ghilimele pentru a ne referi la o ghilimea.

Program bazat pe .NET 2018:
Program C# care folosește șiruri de caractere literale

using System;

class Program
{
    static string _value1 = "String literal";
    const string _value2 = "String literal 2";
    const string _value3 = "String literal 3\r\nAnother line";
    const string _value4 = @"String literal 4
    Another line";
    const string _value5 = "String literal\ttab";
    const string _value6 = @"String literal\ttab";

    static void Main()
    {
        //
        // Motorul de execuție începe aici.
        //
        string test1 = "String literal \"1\"";
        const string test2 = "String literal 2";
        string test3 = @"String literal ""3""";
        const string test4 = @"String literal 4";
        //
        // Afișează șirurile de caractere literale.
        //
        Console.WriteLine(
            "{0}\n{1}\n{2}\n{3}\n{4}\n{5}\n{6}\n{7}\n{8}\n{9}",
            _value1, _value2, _value3, _value4, _value5, _value6,
            test1, test2, test3, test4);
    }
}
 
Ieșire

String literal
String literal 2
String literal 3
Another line
String literal 4
Another line
String literal  tab
String literal\ttab
String literal "1"
String literal 2
String literal "3"
String literal 4
 

Notă la programul de mai sus. Prima referință către șir literal este o variabilă statică, ceea ce înseamnă că va fi referită, în limbajul intermediar generat, în corpul metodelor unde este folosită.


Notă:
Folosind șirul de caractere static va cere motorului de execuție să rezolve simbolul _value1 în metadate.
Static String [EN]


Cu toate acestea:
Poți să reatribui variabilei _value1 oriunde în programul tău unde este accesibilă, cum ar fi în metoda Main.

Simbolul Arond. Patru dintre șirurile literale sunt prefixate cu simbolul @ înainte de semnele de citare. Acest simbol indică faptul că tu folosești sinaxa de șir literal textual.

Sfat:
Poți vedea că backslash-ul este tratat ca un caracter și nu o secvență de șir de evacuare când @ este folosit.

De asemenea:
Compilatorul C# îți permite să folosești linii noi reale în literalii textuali. Trebuie să codifici semnele de citare cu ghilimele duble.

Concat. Concatenarea variabilelor șiruri de caractere este făcută în timpul execuției („runtime”). Dar dacă o variabilă șir de caractere este constantă, compilatorul va genera limbaj intermediar cu concatenările eliminate.

Apoi:
Acest program pare a concatena 3 șiruri de caractere. Când este compilat IL arată că doar un singur șir este folosit.
string.Concat [EN]

Program C# care concatenează șiruri de caractere literale
using System;

class Program
{
    static void Main()
    {
        const string a = "Dot ";
        const string b = "Net ";
        const string c = "Perls";
        Console.WriteLine(a + b + c);
    }
}
 
Ieșire
Dot Net Perls

Limbaj intermediar: IL
.method private hidebysig static void  Main() cil managed
{
  .entrypoint
  // Code size       11 (0xb)
  .maxstack  8
  IL_0000:  ldstr      "Dot Net Perls"
  IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000a:  ret
} // end of method Program::Main



Metadate. Șirurile de caractere literale sunt stocate în format metadate. Acesta este definit în Specificația Limbajului Comun. El include o baza de date cu tabele cu antete și rânduri în toate fișierele exe.

Sfat:
Există câteva fluxuri predefinite în fișierele cu metadate , inclusiv #Strings și #US („user strings” - șiruri ale utilizatorului).

Fluxul #US este folosit pentru a stoca literali definiți de programator. Tabelele de metadate conțin ofseturi către acest flux. Fluxul însuși este o serie concatenată de caractere.

Notă:
Motorul de execuție reține ofseturile și tabelele în memorie și apoi citește un interval în fluxul #US.

Performanța. Înainte ca literalii șiruri de caractere să ajungă în metadate sau în instrucțiunile limbajului intermediar, compilatorul C# aplică o optimizare numită împăturirea constantelor („constant folding”).

Aici:
Constantele de tip șir de caractere literal sunt separate și partajate. Aplicarea împăturirii constantelor manual nu este cerută pentru eficiență.

Stocare:
Dacă folosești un anumit șir de caractere literal într-un program, el este stocat doar o singură dată în fluxul de șiruri de caractere ale utilizatorului („user strings stream”).

În concluzie:
Vedem tehnica compilatorului numită împăturirea constantelor aplicată la șiruri de caractere literale în programe C#.

Pe scurt. Literalii șiruri de caractere sunt specificați cu sintaxa șirurilor textuale („verbatim”). Noi folosm „backslash” ('\') pentru a „evacua” anumite secvențe. Șirurile de caractere literale sunt constante - ele nu pot fi schimbate.


Tradus de pe https://www.dotnetperls.com/string-literal. Am adăugat și 2 capturi de ecran Visual Studio.

Niciun comentariu:

Trimiteți un comentariu