SORU
8 Temmuz 2009, ÇARŞAMBA


C# string referans türü?

Biliyorum "" C# bir başvuru türüdür. dize Bu MSDN'DE. Ancak, bu kod gerektiği gibi çalışmıyor:

class Test
{
    public static void Main()
    {
        string test = "before passing";
        Console.WriteLine(test);
        TestI(test);
        Console.WriteLine(test);
    }

    public static void TestI(string test)
    {
        test = "after passing";
    }
}

Çıkış olmalı "daha önce geçen" "sonra geçen" ben geçen dize olarak bir parametre ve bir başvuru türü, ikinci çıkış deyimi tanımalı, metin değişti bu Testİ yöntemi. Ancak, "" "ref. değer tarafından geçirilen" görünmeye geçirmeden önce geçirmeden önce alıyorum Dizeleri değişmez olduğunu anlıyorum, ama burada neler olduğunu açıklayabilir anlamıyorum. Neyi kaçırıyorum? Teşekkürler.

CEVAP
8 Temmuz 2009, ÇARŞAMBA


Dize için referans değer geçirilir. Değerine göre bir başvuru geçirmeden ve bir nesne başvurusu tarafından geçen arasında büyük fark var. "Referans" her iki durumda da kullanılır. kelime üzücüdür

Eğeryapındize referans geçirirtarafındanbaşvuru, beklediğiniz gibi çalışır:

using System;

class Test
{
    public static void Main()
    {
        string test = "before passing";
        Console.WriteLine(test);
        TestI(ref test);
        Console.WriteLine(test);
    }

    public static void TestI(ref string test)
    {
        test = "after passing";
    }
}

Şimdi bir referans anlamına gelir değişiklik yapma nesneye, bir değişken için bir değişiklik yapma arasında bir ayrım yapmak gerekir (bir parametre gibi) farklı bir nesneye bakın. Dizeleri değişmez çünkü bir dize değişiklik yapamayız, ama StringBuilder ile yerine canlandırabiliriz:

using System;
using System.Text;

class Test
{
    public static void Main()
    {
        StringBuilder test = new StringBuilder();
        Console.WriteLine(test);
        TestI(test);
        Console.WriteLine(test);
    }

    public static void TestI(StringBuilder test)
    {
        // Note that we're not changing the value
        // of the "test" parameter - we're changing
        // the data in the object it's referring to
        test.Append("changing");
    }
}

Daha fazla ayrıntı için my article on parameter passing bkz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Capcom Unity

    Capcom Unity

    5 NİSAN 2010
  • IGN

    IGN

    19 EYLÜL 2006
  • thewinekone

    thewinekone

    17 Aralık 2005