INETA Türkiye Yazılımcılar Kayseri'de Buluşuyor Etkinliği

INETA Türkiye olarak 17 Mart 2012, 18 Mart 2012 tarihlerinde Kayseri Erciyes Üniversitesinde gerçekleştireceğimiz Yazılımcılar Kayseri’de Buluşuyor etkinliğimizin detayları şöyle,

INETA Türkiye Yazılımcılar Kayseri

Etkinliğe kayıt olmak için buraya tıklayın!

Erciyes Üniversitesini harita üzerinde bulmak için buraya tıklayın

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

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

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

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


XNA Tarihçe

XNA tarihçesine baktığımızda, ilk filizlerin 1995 yılında atıldığını görüyoruz.

Windows 95 çıkana kadar, oyunların direk donanıma erişmesi gerekirdi (Örneğin joystick, grafik kartı veya ses kartına)

Bu yüzden oyun geliştirici firmalar, oyunların içerisine her ses kartı ailesinin, her grafik kartı ailesinin komut setlerini gömerlerdi.

Oyunu başlattığımızda genellikle ilk önce bilgisayarımızda bulunan ses kartını ve grafik kartını seçerdik, böylece oyun hangi komut setini kullanacağını bilirdi.

Windows 95 ile birlikte Microsoft, (o zamanki adıyla) Windows Game SDK ismini verdiği bir kütüphane geliştirdi.

Bu kütüphane sayesinde oyunlar direk donanıma erişmek yerine, ara bir katmana erişecekler, böylece donanım’a özel komut setlerini bilmelerine gerek kalmayacaktı.

Windows Game SDK, tanıtılmasından kısa bir süre sonra DirectX 1.0 adı ile yayınlandı.

DirectDraw, DirectInput ve DirectSound katmanlarını içeriyordu. X karakteri, Direct öneki ile başlayan tüm isimleri kısaltmak için seçilmişti.

DirectX öncesinde çeşitli donanımlar ile konuşmanın standart olmaması oyun geliştirmenin en zor yanlarından biriydi. Genellikle geliştirilen oyunlar birden fazla donanım ailesi ile çalışabilecek şekilde yazılırdı, bu da geliştirme süresini ve kodların karmaşıklığını arttırırdı.

DirectX ile birlikte yazılımın donanım ile konuşacağı standart bir dil oluşturulmuş oldu.

Böylelikle oyunlar aslında donanım ile değil, DirectX katmanı ile konuşuyorlar, donanım ile konuşmak ise DirectX‘in görevi oluyor.

1.0 versiyonunda sonra DirectX yıllar içerisinde oldukça yol aldı. 11.0 versiyonu Windows7 ile birlikte duyuruldu. (DirectX9 ile arasındaki tek fark Direct3D katmanının 11.0 versiyona yükseltilmesi)

DirectX, 7.0 versiyonundan itibaren C harici dilleri desteklemeye başladı. İlk başlarda sadece Visual Basic desteklenirken, DirectX 9.0 ile birlikte .Net desteği geldi.

Ayrıca DirectX 8.0, Programlanabilir Shader desteğine sahip ilk sürüm haline getirildi.

DirectX’e .Net desteği gelmesi ile birlikte (Managed DirectX) oyun geliştiriciler tarafında büyük etki yarattı. 2006 yılında XNA adı altında toplanana kadar çok fazla oyun geliştirici tarafından kullanıldı.

XNA 4.0 versiyonu ile birlikte hem Windows, hem Xbox 360, hem de Windows Phone 7 platformlarına oyun geliştirilebiliyor.

C# Global Assembly Cache içine Assembly yüklemek

C# ile geliştirdiğimiz uygulamalar büyüdükçe, uygulama içerisinde ortak kullandığımız yapıları tekilleştirme eğilimi gösteririz. Örneğin; veritabanına erişim, e-posta gönderme, hata geribildirimleri, session kontrolü, vs.

Tekilleştirme yapmak için, ortak metodları, ortak bir sınıf içerisinde toplar ve projenin her yerinde ilgili sınıf üzerinden kullanırız. Örneğin; DAL.ExecuteQuery(); DAL.ExecuteProcedure(); DAL.GetDataTable();

Ortak metodlar çoğaldıkça, ortak bir sınıf yeterli olmaz ve ortak sınıflar oluşturmamız gerekir.Örneğin; Hata.Log(ex); DAL.ExecuteQuery("sorgu", "parametreler"); EMail.Send("alıcı", "konu", "içerik");

Eğer ortak sınıflarımızı çeşitli projeler arasında paylaşmamız gerekiyorsa, bu sınıfları dll assembly‘ler içerisinde toplarız.

Daha sonra her projede, dll assembly’yi projenin referanslarına ekleriz.

Birden fazla projede referans olarak göstereceksek, dll assembly’yi ortak bir alana yüklememiz daha doğru olacaktır.

Böylece ilgili dll’de yapacağımız bir versiyon güncellemesi aynı anda birden fazla projede etkin olacaktır.

.Net dll’lerini koyabildiğimiz ortak alana Global Assembly Cache (kısaca GAC) denmektedir.

Bir .Net assembly’sini GAC‘a eklemek için, .Net Framework ile birlikte gelen gacutil aracını kullanmalıyız. Örnek kullanım : gacutil -i [assembly_yolu]

Komut satırından gerekli parametreleri vererek gacutil aracını kullanabiliriz.

Eğer, bir assembly’yi GAC’a programatik bir yöntemle eklemek istiyorsak, System.EnterpriseServices.Internal namespace’inde yeralan Publish sınıfının GacInstall method’unu kullanmalıyız.

İlk olarak kodumuzun using kısmına System.EnterpriseServices.Internal namespace’ini ekleyelim;

using System.EnterpriseServices.Internal;

Daha sonra yapmamız gereken, Publish sınıfından yeni bir örnek oluşturup, GacInstall method’unu çağırmak.

Özellikle, kendi kurulum uygulamamızı yazacaksak, GAC‘a programatik erişmemiz gerekecektir.

Engin Polat hakkında

Chief Architect, Microsoft RD, Microsoft MVP

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 458

Creative Commons Lisansı