Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem .NET ako pretypovať string na byte array?

"String je v .NET immutable"

To ze string je v .NET immutable je pravda len na urcitej urovni abstrakcie. behove prostredie ti bezne dostupnymi prostriedkami nedovoli menit hodnotu stringu a po kazdej operacii ti vracia novy string na novej adrese. Ak sa pozries pod "poklicku" zistit ze je to len mantra, ktoru opakuju programatori bez toho aby sa nad tym hlbsie zamysleli. Ved ako by sa tam tie znaky dostali, keby sa hodnota stringu nemohla menit? Ale podme na to poporiadku. Co sa deje pri vytvoreni stringu? Najprv sa alokuje pamat, dostanes pointer ukazujuci na miesto v pamati kde ten string je a potom na to miesto zapisujes znaky, teda nie ty ale konstruktor. A ked mas k dispozicii ten pointer tak na to miesto vies zapisovat kolko krat chces a prepisovat ho kolko len chces. Nikto ti v tom nezabrani. Teraz ti to dokazem:

using System;

class Program
{
    static unsafe void Main(string[] args)
    {
        var immutableString = "tak som immutable?";
        Console.WriteLine("Q: {0}", immutableString); //vypise "Q: tak som immutable?"
        fixed (char* ptrStr = immutableString)
        {
            var str2 = "ein";
            var chars = (char*)(long)ptrStr; //ochcali sme C# compiler
            for (var i = 2; i >= 0; i--)
            {
                *chars = str2[i]; chars++;
            }
            chars += (immutableString.Length - str2.Length - 1);
            *chars = '.';
            Console.WriteLine("A: {0}", immutableString); //vypise "A: nie som immutable."
            Console.ReadLine();
        }
    }
}

Ad GetBytes:

Na bezne ucely by som aj ja pouzil asi to built-in riesenie.

Ale pre moj ucel to budem potrebovat navrhnut tak aby som sa uplne vyhol kopirovaniu. To znamena ze nepouzijem managed typy. A namiesto stringu asi pouzijem stary dobry pointer na char.

Ale aj keby mi stacilo kopirovanie. Riesenie od MS je napisane prilis univerzalne s ohladom na bezpecnost tak aby bolo nepriestrelne a fungovalo za kazdych okolnosti co si ale vybera dan v podobe mensieho vykonu. Ja naopak potrebujem jednoucelove, ale co najrychlejsie riesenie.

Ale ked si pozries to riesenie od MS tak neni az take kratke a je plne runtime checkov, ktore su sice uzitocne pre vyvojarov pri ladeni ale zbytocne to cele spomaluju:

tuna to zacina https://github.com/microsoft/referencesource/blob/3b1eaf5203992df69de44c783a3eda37d3d4cd10/mscorlib/system/text/encoder.cs#L189

a tuna to pokracuje https://github.com/microsoft/referencesource/blob/3b1eaf5203992df69de44c783a3eda37d3d4cd10/mscorlib/system/text/unicodeencoding.cs#L438

Reakce na odpověď

1 Zadajte svou přezdívku:
2 Napište svou odpověď:
3 Pokud chcete dostat ban, zadejte libovolný text:

Zpět do poradny