SORU
3 ŞUBAT 2012, Cuma


Kaç Dize nesneleri bir artı işareti kullanılarak oluşturulur?

Kaç Dize nesneleri kod aşağıda bir artı işareti kullanılarak oluşturulur?

String result = "1"   "2"   "3"   "4";

Eğer aşağıda olsaydı, üç Dize nesneleri derdim: "1", "2", "12".

String result = "1"   "2";

Ben de String nesneleri performans geliştirme için Dize Stajyer Havuzu/Tablosunda önbelleğe biliyor, ama mesele o değil.

CEVAP
3 ŞUBAT 2012, Cuma


Şaşırtıcı bir şekilde, duruma göre değişir.

Bir yöntem içinde:

void Foo() {
    String one = "1";
    String two = "2";
    String result = one   two   "34";
    Console.Out.WriteLine(result);
}

sonra derleyici kodu String.Concat @Joachim cevap olarak ( onu 1 arada) yayarlar gibi görünüyor.

Onları olarak tanımlarsanızsabitlerörneğin:

const String one = "1";
const String two = "2";
const String result = one   two   "34";

ya gibihazırözgün söz konusu gibi

String result = "1"   "2"   "3"   "4";

sonra derleyici hemen bu işaretlerin optimize eder. Eşdeğer:

const String result = "1234";

Ayrıca, derleyici yabancı sabit ifade Kaldır ve sadece kullanılan ya da maruz kalan varsa onları çıkarır. Örneğin, bu program:

const String one = "1";
const String two = "1";
const String result = one   two   "34";

public static void main(string[] args) {
    Console.Out.WriteLine(result);
}

Tek bir dize oluşturur - sürekli result (eşit "1234"). one two elde edilen IL görünmüyor.

Zamanında fazla iyileştirmeler olabilir unutmayın. Sadece IL üretilir ne ile gideceğim.

Staj ile ilgili olarak son olarak, sabit ve değişmez değerler staj yaptım ama staj olduğu değeri IL sonuçlanan sabit değer, sabit değildir. Bu birden fazla aynı şekilde tanımlı sabitler veya harfleri aslında aynı nesne olacağından beklediğinizden daha az dize nesneleri almak olabilir anlamına gelir! Bu, aşağıdaki gibi gösterilmiştir:

public class Program
{
    private const String one = "1";
    private const String two = "2";
    private const String RESULT = one   two   "34";

    static String MakeIt()
    {
        return "1"   "2"   "3"   "4";
    }   

    static void Main(string[] args)
    {
        string result = "1"   "2"   "34";

        // Prints "True"
        Console.Out.WriteLine(Object.ReferenceEquals(result, MakeIt()));

        // Prints "True" also
        Console.Out.WriteLine(Object.ReferenceEquals(result, RESULT));
        Console.ReadKey();
    }
}

Dize bir döngü içinde birleştirilmiş durumda (veya başka bir dinamik olarak), birleştirme başına bir ekstra dize ile bitirmek. Örneğin, aşağıdaki 12 dize örneklerini oluşturur: 2 10 yineleme, yeni bir Dize örneği sonuç: Her sabitler

public class Program
{
    static void Main(string[] args)
    {
        string result = "";
        for (int i = 0; i < 10; i  )
            result  = "a";
        Console.ReadKey();
    }
}

(Sürpriz bir şekilde) ancak, birden fazla üst üste birbirine bağlanması çok dizeli tek bir birleştirme içine derleyici tarafından birleştirilir. Örneğin, bu program da sadece 12 dize örneklerini üretiyor! Çünkü bu "Even if you use several operators in one statement, the string content is copied only once."

public class Program
{
    static void Main(string[] args)
    {
        string result = "";
        for (int i = 0; i < 10; i  )
            result  = "a"   result;
        Console.ReadKey();
    }
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • chrmoe

    chrmoe

    7 Kasım 2006
  • colacas

    colacas

    29 EKİM 2006
  • magnum33563

    magnum33563

    8 NİSAN 2011