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) + "]", "}");
}


İlgili diğer makaleler

blog comments powered by Disqus

Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı