February, 2012 | Engin Polat'ın Windows, Web, Mobile ve Game içerikli programcılık sitesi

Arşiv

2012 February ayı için arşiv

INETA Türkiye Yazılımcılar İstanbul’da Buluşuyor Etkinliği

11 February 2012 Yorum yapılmamış

INETA Türkiye olarak 18 Şubat 2012, 19 Şubat 2012 tarihlerinde Microsoft Türkiye İstanbul ofisinde gerçekleştireceğimiz Yazılımcılar İstanbul’da Buluşuyor etkinliğimizin detayları şöyle,

INETA Türkiye Yazılımcılar İstanbul'da Buluşuyor Etkinliği

Etkinliğe kayıt olmak için buraya tıklayın! Etkinliğe kayıt olmanız, güvenliğe teslim edilecek listede yer almanız ve içeriye rahat giriş yapabilmeniz için önemli!

Microsoft Türkiye İstanbul ofisi ile ilgili iletişim bilgilerine ulaşmak için buraya tıklayın

StringBuilder alternatifi olarak String.Join

07 February 2012 Yorum yapılmamış

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<Order> Orders{ get; set; }
}

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;

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();
}

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