StringBuilder alternatifi olarak String.Join

String sınıfının immutable olduğunu duymayanımız kalmamıştır (bknz; string sınıfı neden immutable?)

string tipindeki bir değişkenin değeri üzerinde sürekli değişiklik yapıp Garbage Collector‘a gereksiz iş oluşturmak yerine, StringBuilder sınıfını kullanırız (Garbage Collector hakkında detaylı bilgi için bknz; Garbage Collector Temelleri ve Performans Noktaları)

Çeşitli sebeplerden dolayı (Loglama, XML veya JSON veri üretme, vs) sınıflarımızın ToString() method’larını override ederiz (bknz; ToString() Method’unu override etmek)

ToString() method’undan geriye string değer döndüreceğimiz için method içerisinde string değer tutabilecek bir değişkene ihtiyaç duyarız. Bu değişken yukarıda bahsettiğimiz nedenlerden dolayı genelde StringBuilder tipinde olur.

Örnek ProductOrderCollection sınıfımızın ProductID ve Orders isminde property‘leri olduğunu varsayalım;

public class ProductOrderCollection { public int ProductID { get; set; }

public IEnumerable&lt;Order&gt; Orders{ get; set; } }</pre>

ToString() method’unu override ettiğimiz örnek kod parçası;

public override string ToString()
{
    StringBuilder sb = new StringBuilder();
    sb.Append("Product{Id=");
    sb.Append(this.Id);
    sb.Append(",Orders=");
    if (this.Orders == null)
    {
        sb.Append("null");
    }
    else
    {
        sb.Append("[");
        for (int i = 0; i < this.Orders.Length; i++)
        {
            if (i > 0 && i < this.Orders.Length - 1)
            {
                sb.Append(",");
            }

            sb.Append(this.Orders[i]);
        }

        sb.Append("]");
    }

    sb.Append("}");

    return sb.ToString();
}

Yukarıdaki örnek kod sayesinde ProductOrderCollection sınıfının verilerinden JSON değer üretebiliriz.

StringBuilder sınıfı yerine String.Join methodunu kullanarak yapacak olsaydık;

</pre><pre class="brush:csharp">public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append(“Product{Id=”); sb.Append(this.Id); sb.Append(“,Orders=”); if (this.Orders == null) { sb.Append(“null”); } else { sb.Append(“[”); sb.Append(string.Join(“,”, this.Orders)); sb.Append(“]”); }

sb.Append("}");

return sb.ToString(); }</pre>

Hatta if/else kod parçasını daha da kısaltabiliriz;

public override string ToString()
{
    StringBuilder sb = new StringBuilder();
    sb.Append("Product{Id=");
    sb.Append(this.Id);
    sb.Append(",Orders=");
    sb.Append(this.Orders == null ? "null" : "[" + string.Join(",", this.Orders) + "]");
    sb.Append("}");

    return sb.ToString();
}

StringBuilder sınıfını hiç kullanmamak için;

public override string ToString()
{
    return string.Join("Product{Id=", this.Id, ",Orders=", this.Orders == null ? "null" : "[" + string.Join(",", this.Orders) + "]", "}");
}


blog comments powered by Disqus

Engin Polat hakkında

Chief Architect, Microsoft RD, Microsoft MVP

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 452

Creative Commons Lisansı