Live Chat Software
Emre CIRIK | C# 4.0 Dynamic Language Runtime

C# 4.0 Dynamic Language Runtime

by EMRCRK 3. April 2011 10:49

Arkadaşlar bu yazımda size C# 4.0 yeniliklerinden elimden geldiğince bahsetmeye çalışacağım. Yaklaşık 2 gündür bu konu üzerinde araştırmalar yapıp denemeler uyguluyorum. .NET Framework 3.5 te takip edebildiğim en son yenilikler LINQ,var anahtar sözcüğü ve sonrasından geleceğini duyduğum Entity Framework yapıları olmuştu. Gün geçtikçe yeni şeyler çıkıyor fakat takip etmek oldukça zor oluyor heleki bir öğrenci ve çalışan bir insansanız. Ben bu konuda baya geri kaldığımı düşünüyorum. 

Arkadaşlar "Dynamic Language Runtime " IronPyhton , IronRuby gibi dinamik programlama dillerinin C# , VB.NET gibi 

statik diller ile iletişimini kurmasını sağlayan ve bu dillere dinamik özellikler kazandıran .NET alt yapısıdır.

Şimdi size hoşuma giden C# 4 özelliklerinden bahsedicem :

1-) Metotlarımızda opsiyonlu parametreler oluşturabiliyoruz.

Örnek : 

.NET Framework 3.5 

void TestMetot(string ad)

{

   Console.WriteLine("Ad : {0} ",a);

}

void TestMetot(string ad,string soyad)

{

  Console.WriteLine("Ad: {0}, Soyad: {1} ", ad,soyad);

}

Şimdi aşağıdaki koda bakın . 

.NET Framework 4.0

void TestMetot(string ad="Emre",string soyad="CIRIK")

{

      Console.WriteLine("Ad: {0}, Soyad: {1} ", ad,soyad);

}

 

Arkadaşlar ben metodumu parametre göndermeden çağrırsam eğer .NET Framework 3.5 ve öncesi için diyorum. Program bana hata verecektir. En az string tipinde 1 parametre göndermek gibi.

No overload for method 'TestMetot' takes 0 arguments

Fakat .NET Framework 4 yapısını incelediğinizde metodumu direk şu şekilde çağıra bilirim :

TestMetot() ;// Program çıktısı Ad: Emre , Soyad: CIRIK şeklinde olacaktır

 

2-) dynamik anahtar kelimesi . Bu keyword doğru yerde kullanılırsa bizim için daha hızlı sonuçlar verebiliyor, performans artışı olabilir. Şimdi dynamic başlı başına ele alınması gereken güzel bir konudur arkadaşlar. Belirli noktalarda - leri ve + ları vardır. Ben ilk başta var ile arasında ki fark varmı diye sordum kendi kendime . Bu sorumun bile başlı başına bir hata ve saçmalık olduğunu öğrendim.

"dynamic" ve "var" arasında ciddi bir fark var. Örnekle açıklamam gerekirse :

var ds=new DataSet();

şeklinde bir tanımlama yaparsam  ds DataSet e ait bütün özellikleri ,Metotlarını alır. ds. yazdığımda Clone() metodunun gelmesi gibi.

 

fakat 

dynamic ds=new DataSet(); 

şeklinde bir tanımlama yaparsam  ben ds. yazdığımda ise DataSet nesnesine ait hiç bir özellik göremem. Çünkü dynamic runtime esnasında tipini belirler.

 


        private void button1_Click(object sender, EventArgs e)
        {

            dynamic d = new ExpandoObject();
            d.Ad= "Emre";
            Console.WriteLine(d.Ad);

        }
Bunun çıktısıda Emre olucaktır. Peki dynamic burada ne yaptı . 
Programı reflectore soktuğumuzda arka planda oluşan kod :
private void button1_Click(object sender, EventArgs e)
{
    object d = new ExpandoObject();
    if (<button1_Click>o__SiteContainer0.<>p__Site1 == null)
    {
        <button1_Click>o__SiteContainer0.<>p__Site1 = CallSite<Func<CallSite, object, string, object>>
.Create(Binder.SetMember(CSharpBinderFlags.None, "Ad", typeof(Form1),
 new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null),
 CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant | CSharpArgumentInfoFlags.UseCompileTimeType, null) }));
    }
    <button1_Click>o__SiteContainer0.<>p__Site1.Target.Invoke(<button1_Click>o__SiteContainer0.<>p__Site1, d, "Emre");
    if (<button1_Click>o__SiteContainer0.<>p__Site2 == null)
    {
        <button1_Click>o__SiteContainer0.<>p__Site2 = CallSite<Action<CallSite, Type, object>>
.Create(Binder.InvokeMember(CSharpBinderFlags.ResultDiscarded, "WriteLine", null, typeof(Form1),
 new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.IsStaticType |
 CSharpArgumentInfoFlags.UseCompileTimeType, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) }));
    }
    if (<button1_Click>o__SiteContainer0.<>p__Site3 == null)
    {
        <button1_Click>o__SiteContainer0.<>p__Site3 = CallSite<Func<CallSite, object, object>>.
Create(Binder.GetMember(CSharpBinderFlags.None, "Ad", typeof(Form1), new CSharpArgumentInfo[] 
{ CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) }));
    }
    <button1_Click>o__SiteContainer0.<>p__Site2.Target.Invoke(<button1_Click>o__SiteContainer0.<>p__Site2,
 typeof(Console), <button1_Click>o__SiteContainer0.<>p__Site3.Target.Invoke(<button1_Click>o__SiteContainer0.<>p__Site3, d));

}

Gördüğünüz üzere arkaplanda gerçekleşen kodlar obje oluştur ,string tipinde Ad özelliğini ekle ve ona "Emre" değerini ver.

3-) COM Objeleri ile iletişim 

Arkadaşlar dynamic ile COM nesneleri arasındaki iletişimde daha iyi sağlanmıştır. Örnek olarak Office Excel ve Word Uygulaması :

 

        void COMTest()
        {
         var excel = new Excel.Application();
        
         excel.Visible = true;
        excel.Workbooks.Add();                    // opsiyonlu parametre
        excel.Cells[1, 1].Value = "Process Name"// tip dönüşümü olmadan dinamik değer 
        excel.Cells[1, 2].Value = "Memory Usage"
        var processes = Process.GetProcesses().Take(10);

        int i = 2;
        foreach (var p in processes) {
            excel.Cells[i, 1].Value = p.ProcessName; 
            excel.Cells[i, 2].Value = p.WorkingSet;  
            i++;
        }
        Excel.Range range = excel.Cells[1, 1];      
        Excel.Chart chart = excel.ActiveWorkbook.Charts.
            Add(After: excel.ActiveSheet);         
        chart.ChartWizard(
            Source: range.CurrentRegion,
            Title: "Memory Usage in " + Environment.MachineName); //isim ve opsiyonal parametre
        chart.ChartStyle = 45;
        chart.CopyPicture(Excel.XlPictureAppearance.xlScreen,
            Excel.XlCopyPictureFormat.xlBitmap,
            Excel.XlPictureAppearance.xlScreen);
        var word = new Word.Application();
        word.Visible = true;
        word.Documents.Add();          // opsiyonal parametre
        word.Selection.Paste();

        }
    }

 


Visual Studio 2010 ile yaptığım örnek uygulamayı indire bilirsiniz..


DynamicDiffrenceVar.rar (54,23 kb)

 

Arkadaşlar konuyu tam olarak anlayamamış olabilirsiniz , bunu anlamak için öncelikle kendiniz denemeler yapıp breakpointler koyarak işleyişi daha iyi anlaya bilirsiniz. Visual Studio 2010'un Call Stack penceresinde daha detaylı öğrene bilirsiniz. 

Bir daha ki yazımda görüşmek üzere =)

Tags: , , , , , , ,

CSharp

Add comment




  Country flag
biuquote
  • Comment
  • Preview
Loading






Month List

Calendar

<<  December 2016  >>
MoTuWeThFrSaSu
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

View posts in large calendar