none
C# Yazım Standartları Kafama takılan Soru

    Soru

  • Merhaba

    Yeni Başladıgım C# Yazılım Standartlarıyla Yazmak için Size bilmedigim takıldıgım noktalrı sormak iştiyorum.

    Yeni Bir form Acarken var İle Yapmakmı Yoksa Normal İlk Yazım Sekli Arasındaki Fark nedir..?

    Form2  Frm2 = new Form2()
    
    Frm2.Show();
    
    Ama
    var   Frm2 = new Form2()
    
    Frm2.Show();

    Usin Eklemede Kodlamadaki Fark Nedir...?

    Form2 Frm2 = new Form2() Frm2.Show(); Ama

    Using (var Frm = new Form2)

    {

    Frm.ShowDialog();

    }


    22 Mart 2013 Cuma 06:04

Yanıtlar

  • var sözcüğü, nesnenin dolaylı tanımlanması için kullanılır, diğerinden çok farkı yok. Yazımı kolaylaştırır. Özellikle linq sonucunu tam kestiremediğin sorgular için birebir.

    var form = new Form1(); dediğinde  form değişkenin Form1'dir yine.

    var sw = new  System.IO.StreamWriter();

    System.IO.StreamWriter sw = new  System.IO.StreamWriter();

    Yazımı kolay.

    var i=(Linq Sorgusu).... sonucunda elde ettiğin bir dizi de olabilir tek bir string de. Bunu baştan kestirmek veya sonucu değiştirmek istediğinde devamını uyarlamak kolay olur.

    Bu üsttekinden farklı olarak using uygulamanın performansı açısından etkili olabilir. Using ile oluşturulan nesne işi bittiğinde bellekten kaldırılır, ayrıca senin Dispose etmene gerek kalmaz. Formlar için ne kadar tercih edilir bilmem ama kısa süreli kullanıp atacağın nesneleri oluşturmak için mantıklıdır.

    Kabaca böyle.

    22 Mart 2013 Cuma 06:32
  • Aslan hocam bahsetmiş, using class instance'ını otomatik olarak Dispose eder. Tabi classın IDisposable olması gerektiğini söymemeye gerek yok. Dispose işlemi -bildiğim kadarıyla- GarbageCollector tarafından instance'ın ramdan kaldırılma işlemini başlatır.

    Ben bir şey daha ilave etmek isterim. 

    var i = 0;

    ile

    int i = 0;

    aynı işi yapıyor olsada aralarında farklar vardır. 

    İlk fark; var deklerasyon yapmaz. Yani

    var i;

    diyemezsiniz.

    İkinci fark ise, var yanlız ve yanlız method, getter ve setter içinde kullanılabilir. Yani;

    class Class1
    {
        var i = 0; //yanlış
        void Method1()
        {
             var i = 0; //doğru
         }
    }
    


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    22 Mart 2013 Cuma 07:41
  • Dispose işlemi -bildiğim kadarıyla- GarbageCollector tarafından instance'ın ramdan kaldırılma işlemini başlatır.

    Bir nesne disposable ise (nşa) o nesne GC nin erişemeyeceği bellek bölgelerinde de (unmanaged/native) veri tutuyordur. Amacı da bu bölgelerdeki normalde GC nin toplayamayacağı alanları boşaltmaktır. Filestream ve DBConnection'lar en büyük örneklerdir. 

    Hatta dispose (nşa) SuppressFinalize metodunu çalıştırdığı için ilgili sınıfın finalizerı GC tarafından çalıştırılmaz.

     Using aslında Try/Finaly bloğunun eş değeridir.

    using(var a = new x())

    {//kodlar}


    ile

    var a = new x());try{
    
    //kodlar
    
    }
    
    finally
    
    {a.Dispose();}
    


    aynıdır.

    ----

     

    Var olayına gelince, CLR  (.net in kalbi diyelim :D ) tarafında böyle bir sözcük / veritipi yoktur. Siz kodda var yazdığınızda derleme işleminden önce var sözcüğü sağ taraftaki nesnenin tipi ile değiştirilir. Yani siz,

    var i = 4;

    yazdığınızda, build işlemini başlattığınızda o arkaplanda

    int i = 4; e çevrilecektir.

     

    Bu yüzdendir ki, sağ tarafta bir nesne yok veya nesnenin tipi bilinemiyor ise bu sözcüğü kullanamazsınız.

    Tek amacı kodun daha hızlı yazılmasıdır. Fakat dikkatli kullanılmadığı durumlarda fark edilemeyen hatalara neden olur.







    • Düzenleyen Cihan Yakar 22 Mart 2013 Cuma 11:22
    • Yanıt Olarak Öneren Aslan EModerator 22 Mart 2013 Cuma 12:30
    • Yanıt Olarak İşaretleyen Pr0c3ss 22 Mart 2013 Cuma 12:40
    22 Mart 2013 Cuma 11:16
  • Burada IDisposable arayüzü implemente edilmiş sınıflara verilen bir özelliktir. Aslan E arkadaşımızın da dediği gibi bellek performansı için kullanılır.
    22 Mart 2013 Cuma 07:36

Tüm Yanıtlar

  • var sözcüğü, nesnenin dolaylı tanımlanması için kullanılır, diğerinden çok farkı yok. Yazımı kolaylaştırır. Özellikle linq sonucunu tam kestiremediğin sorgular için birebir.

    var form = new Form1(); dediğinde  form değişkenin Form1'dir yine.

    var sw = new  System.IO.StreamWriter();

    System.IO.StreamWriter sw = new  System.IO.StreamWriter();

    Yazımı kolay.

    var i=(Linq Sorgusu).... sonucunda elde ettiğin bir dizi de olabilir tek bir string de. Bunu baştan kestirmek veya sonucu değiştirmek istediğinde devamını uyarlamak kolay olur.

    Bu üsttekinden farklı olarak using uygulamanın performansı açısından etkili olabilir. Using ile oluşturulan nesne işi bittiğinde bellekten kaldırılır, ayrıca senin Dispose etmene gerek kalmaz. Formlar için ne kadar tercih edilir bilmem ama kısa süreli kullanıp atacağın nesneleri oluşturmak için mantıklıdır.

    Kabaca böyle.

    22 Mart 2013 Cuma 06:32
  • Merhaba

    peki Altaki satır

    Using (var Frm = new Form2)

    {

    Frm.ShowDialog();

    }

    22 Mart 2013 Cuma 07:27
  • Burada IDisposable arayüzü implemente edilmiş sınıflara verilen bir özelliktir. Aslan E arkadaşımızın da dediği gibi bellek performansı için kullanılır.
    22 Mart 2013 Cuma 07:36
  • Aslan hocam bahsetmiş, using class instance'ını otomatik olarak Dispose eder. Tabi classın IDisposable olması gerektiğini söymemeye gerek yok. Dispose işlemi -bildiğim kadarıyla- GarbageCollector tarafından instance'ın ramdan kaldırılma işlemini başlatır.

    Ben bir şey daha ilave etmek isterim. 

    var i = 0;

    ile

    int i = 0;

    aynı işi yapıyor olsada aralarında farklar vardır. 

    İlk fark; var deklerasyon yapmaz. Yani

    var i;

    diyemezsiniz.

    İkinci fark ise, var yanlız ve yanlız method, getter ve setter içinde kullanılabilir. Yani;

    class Class1
    {
        var i = 0; //yanlış
        void Method1()
        {
             var i = 0; //doğru
         }
    }
    


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    22 Mart 2013 Cuma 07:41
  • Dispose işlemi -bildiğim kadarıyla- GarbageCollector tarafından instance'ın ramdan kaldırılma işlemini başlatır.

    Bir nesne disposable ise (nşa) o nesne GC nin erişemeyeceği bellek bölgelerinde de (unmanaged/native) veri tutuyordur. Amacı da bu bölgelerdeki normalde GC nin toplayamayacağı alanları boşaltmaktır. Filestream ve DBConnection'lar en büyük örneklerdir. 

    Hatta dispose (nşa) SuppressFinalize metodunu çalıştırdığı için ilgili sınıfın finalizerı GC tarafından çalıştırılmaz.

     Using aslında Try/Finaly bloğunun eş değeridir.

    using(var a = new x())

    {//kodlar}


    ile

    var a = new x());try{
    
    //kodlar
    
    }
    
    finally
    
    {a.Dispose();}
    


    aynıdır.

    ----

     

    Var olayına gelince, CLR  (.net in kalbi diyelim :D ) tarafında böyle bir sözcük / veritipi yoktur. Siz kodda var yazdığınızda derleme işleminden önce var sözcüğü sağ taraftaki nesnenin tipi ile değiştirilir. Yani siz,

    var i = 4;

    yazdığınızda, build işlemini başlattığınızda o arkaplanda

    int i = 4; e çevrilecektir.

     

    Bu yüzdendir ki, sağ tarafta bir nesne yok veya nesnenin tipi bilinemiyor ise bu sözcüğü kullanamazsınız.

    Tek amacı kodun daha hızlı yazılmasıdır. Fakat dikkatli kullanılmadığı durumlarda fark edilemeyen hatalara neden olur.







    • Düzenleyen Cihan Yakar 22 Mart 2013 Cuma 11:22
    • Yanıt Olarak Öneren Aslan EModerator 22 Mart 2013 Cuma 12:30
    • Yanıt Olarak İşaretleyen Pr0c3ss 22 Mart 2013 Cuma 12:40
    22 Mart 2013 Cuma 11:16
  • Öncelikle Cevaplarınız İçin Tşkler..

    Sizden BÖle standrtların oldugu Bir döküman Ve Kaynak varsa paylasabilrisiniz...

    22 Mart 2013 Cuma 12:41
  • Kaynak için öncelikle MSDN akla gelmeli.

    http://msdn.microsoft.com/tr-tr/library/bb383973.aspx

    22 Mart 2013 Cuma 12:48
  • Dispose işlemi -bildiğim kadarıyla- GarbageCollector tarafından instance'ın ramdan kaldırılma işlemini başlatır.

    Bir nesne disposable ise (nşa) o nesne GC nin erişemeyeceği bellek bölgelerinde de (unmanaged/native) veri tutuyordur. Amacı da bu bölgelerdeki normalde GC nin toplayamayacağı alanları boşaltmaktır. Filestream ve DBConnection'lar en büyük örneklerdir. 

    Hatta dispose (nşa) SuppressFinalize metodunu çalıştırdığı için ilgili sınıfın finalizerı GC tarafından çalıştırılmaz.

     Using aslında Try/Finaly bloğunun eş değeridir.

    using(var a = new x())

    {//kodlar}


    ile

    var a = new x());try{
    
    //kodlar
    
    }
    
    finally
    
    {a.Dispose();}


    aynıdır.

    ----

     

    Var olayına gelince, CLR  (.net in kalbi diyelim :D ) tarafında böyle bir sözcük / veritipi yoktur. Siz kodda var yazdığınızda derleme işleminden önce var sözcüğü sağ taraftaki nesnenin tipi ile değiştirilir. Yani siz,

    var i = 4;

    yazdığınızda, build işlemini başlattığınızda o arkaplanda

    int i = 4; e çevrilecektir.

     

    Bu yüzdendir ki, sağ tarafta bir nesne yok veya nesnenin tipi bilinemiyor ise bu sözcüğü kullanamazsınız.

    Tek amacı kodun daha hızlı yazılmasıdır. Fakat dikkatli kullanılmadığı durumlarda fark edilemeyen hatalara neden olur.







    gayet net ve anlaşılır bir yazı olmuş, aklıma takılan noktaları gerçekten aydınlattı. Kendi adıma teşekkür ederim.
    22 Mart 2013 Cuma 13:51
  • var işlevini incelerken dynamic kelimesininde işlevini inceleyiniz. Anonymous object kullanırken çok noktada imdada yetişiverir. dynamic ile yapılan atamalarda veri tipi var gibi derleme sırasında değilde runtime zamanında belirlenir. Örnek;

    List<object> _list = new List<object>(); _list.Add(new { Make = "Lamborghini", Model = "Murciélago" }); _list.Add(new { Make = "Lamborghini", Model = "Aventador" }); _list.Add(new { Make = "Aston Martin", Model = "DBS" });

    //KULLANILAMAZ foreach (var item in _list) { Console.WriteLine(item.Make + ":" + item.Model); }

    //DOĞRU KULLANIM foreach (dynamic item in _list) { Console.WriteLine(item.Make + ":" + item.Model); }



    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    22 Mart 2013 Cuma 14:18
  • dynamic güzel bir özellik olsa da c# static bir dildir ve bu şekilde kullanılmalıdır diye düşünüyorum -tamamen kişisel. Bu şekilde dinamik yazılan kodlar derleme sırasında hata vermediklerinden olmadık bir zamanda bir field ya da property e erişemeyip çalışma zamanında gerek tür uyumsuzluğundan gerek imla hatasından patlayabilir. Dynamic'i ironpython gibi dinamik diller ile birlikte kullanımlar haricinde kullanmaktan kaçınmak lazım.

    Yukarıdaki örnek şöyle yazılabilirdi :

    var _list = (new [] {
    new { Make = "Lamborghini", Model = "Murciélago" },
    new { Make = "Lamborghini", Model = "Aventador" },
    new { Make = "Aston Martin", Model = "DBS" }}).ToList();
    
    foreach (var item in _list)
    {
        Console.WriteLine(item.Make + ":" + item.Model);
    }
    


    22 Mart 2013 Cuma 14:44
  • Cihan Bey bazan iyice sallama şeyler yazıp tartışma ortamı oluşturmak, verdiğiniz yanıtları beklemek geliyor içimden, yanıtlarınız gerçekten çok değerli ve umarım yeni arkadaşlar okuyup faydalanırlar. En azından ben faydalanıyorum.

    Yukarıdaki örnek hakkında ise tabi herzaman liste kod içinde bu şekilde hardcode edilmez. dynamic kullanımının Serialize ve deserialize işlemlerinde büyük kolaylık sağlayacağını düşünüyorum. Yazılım zaten sıfır hata ile yazılmalıdır. Doğru tasarlandıktan sonra bir sorun çıkması sözkonusu olmaz. Eğer yazılımcı item.Make yerine item.Made yazıyorsa bu C# ın suçu değildir diye düşünüyorum.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    22 Mart 2013 Cuma 15:29
  •  Eğer yazılımcı item.Make yerine item.Made yazıyorsa bu C# ın suçu değildir diye düşünüyorum.

    Şu sıralar javascript ile oldukça iç içeyiz ve yazım hataları, tür dönüşüm hataları, parantez hataları gibi C# - Vb.net de hiçte alışık olmadığımız çalışma zamanı sıkıntıları yaşayabiliyoruz. Buda ciddi vakit kaybı demek. Allahtan Visual Studio js debug edebiliyor :). Bu yüzden javascript'i bir katman üste taşıyıp TypeScript'e geçme çalışmaları yapıyoruz. İnsan faktörü olduğu sürece hata olacaktır. IDE, Complier bunu uygulama derlenmeden ne kadar minimum a indiriyorsa o kadar iyidir diye düşünüyorum. Bu Word'de imla düzeltme aracını kapatıp, tüm metni baştan sona tekrar tekrar okumaya benziyor bence :) Tabi sadece kişisel görüşler...
    22 Mart 2013 Cuma 16:03