Kod: Console. WriteLine("\t \t ", person. Name, person. Salary); Kısmı; Kod: Console. WriteLine("\t \t ", personList. Name, personList. Salary); olması gerekiyor. Win7 de konsol uygulamasına çok kısıtlama getirdikleri halde. Net de Dinamic Console geliştirmeleri garip. Demek ki sadece. Net ile tam erişim sağlatıcaklar. Bu arada. Net i kullanmıyacağım demiştim ama LinQ ne zaman çıktı, o zaman dan beridir ilgi duymaya başladım. LinQ bu güne kadar geliştirilmiş en akıllıca çözüm. Çok güzel bir makale.

Evet, bunu başardığını her fırsatta dile getiriyorum.. Biliyorum delphiciler kızıyor bana cidden böyle.. Java'yıda bitirmek istiyorlar.. Üniversitelerde, laboratuarlar kuruyorlar.. C# öğretin diye.. Ama buda benim görüşüm: c#, java'nın yanında bir hiç

Bildiğiniz üzere. Net Framework 4.0 ile birlikte gelmesi muhtemel en köklü yenilikler arasında Dynamic Language Runtime alt yapısı yer almaktadır. Bu anlamda daha önceden dynamic anahtar kelimesini inceleyerek tiplerin dinamik olarak oluşturulup kullanılmasını kavramaya çalışmıştık. Bu yazımızda ise, nasıl bir yenilikten bahsedeceğimizi anlatabilmek için öncelikle aşağıdaki kod parçasına odaklanmanızı istiyorum. Not : Örnek henüz yayınlanmış olan Visual Studio 2010 Ultimate Beta 2 sürümü üzerinde geliştirilmiş bir Console uygulamasıdır. Kod: Console. WriteLine ; dynamic employee = new ExpandoObject ; employee. Name = "Burak"; employee. Salary = 1000.23F; employee. Birth = new DateTime(1976, 12, 4); employee. WorkingArea = new ExpandoObject ; employee. WorkingArea. City = "Istanbul" ; employee. WorkingArea. Degree = 1; employee. WorkingArea. CustomerCount = 190; Console. WriteLine(String. Format("\tName: City: Degree:( )", employee. Name, employee. WorkingArea. City, employee. WorkingArea. Degree)); Şimdi bu kod parçası ile ilişkili olara bir kaç ipucu vermek istiyorum; 1. Öncelikli olarak uygulamamızda Name, Salary ve diğer özelliklere sahip Employee gibi ismi olan herhangibir tip tanımı bulunmamaktadır. 2. İkinci kodu yazdığımız sırada employee isimli değişkene herhangi bir özellik eklemek istediğimizde aşağıdaki bilgi penceresi ile karşılaşırız. Ahaaaa!!! Sanıyorum olayın sizde farkına varmış durumdasınız. Aslında employee ismiyle tanımlamış olduğumuz değişkeni bir sınıf nesne örneği olarak inşa ettiğimizi düşünebiliriz. Ancak bunun için Emplyee tipini tanımlamış değiliz. Tamamen kodlama zamanında verdiğimiz bazı kararlar uygulamaktayız. Örneğin employee ismiyle tanımlanan tipin ve içeriğinin oluşturulması aşaması tamamen çalışma zamanına bırakılmış durumdadır. employee isimli değişkenin Name, Salary, Birth gibi özellikleri dışında başka bir ExpandoObject tipine işaret eden WorkingArea isimli bir özelliği daha bulunmaktadır. Buna göre WorkingArea özelliği de bir tip olarak düşünülebilir ki City, Degree, CustomerCount gibi özellikleri yer almaktadır. Tabiki çalışma zamanında, özelliklere atanan değerlere göre tiplerin ne olacağı da belirlenmektedir. Buna göre örneğin Name özelliğinin çalışma zamanında string tipinden olacağı açık ve nettir. Ancak WorkingArea özelliğinin kendiside aslında bir ExpandoObject tipidir. Kodun ilerleyen kısımlarına baktığımızda, employee değişkeninin özelliklerini kullanabildiğimizi de görebiliriz. Örnek kod parçamızın çalışma zamanı çıktısı aşağıdaki gibi olacaktır. ExpandoObject tipinin aslında hangi amaçla kullanıldığını ilk etapta görmüş olduk. Peki daha neler yapabiliriz? Örneğin bir liste veya dizi oluşturulmasında, ExpandoObject nesnelerini kullanabilir miyiz? İşte cevabımız; Kod: Console. WriteLine ; dynamic personList = new List<dynamic> ; personList. Add(new ExpandoObject ; personList . Name = "Burak"; personList . Salary = 1000; personList. Add(new ExpandoObject ; personList . Name = "Bill"; personList . Salary = 1250; personList. Add(new ExpandoObject ; personList . Name = "Eva"; personList . Salary = 1050; personList. Add(new ExpandoObject ; personList . Name = "Mayk"; personList . Salary = 900; foreach Console. WriteLine("\t \t ", person. Name, person. Salary); Bu sefer List<dynamic> tipinden bir koleksiyon oluşturulduğu ve koleksiyonun her bir nesnesinin ExpandoObject tipinden tanımlandığı görülmektedir. Buna göre örnek olarak Name ve Salary özellikleri olan nesnelerin dynamic listeye eklendiği görülebilir. Tabiki her öğe oluşturulma işleminden önce koleksiyona ExpandoObject tipinden bir nesne örneği eklenmesi gerekmektedir. Örneğin çalışma zamanındaki çıktısı aşağıdaki gibidir. Hatta istersek çalışma zamanında oluşturulacak bu nesneler üzerinde LINQ sorgularının çalıştırılmasını da sağlayabiliriz. Aşağıdaki kod parçasında yukarıdaki listenin bir LINQ ifadesi ile sorgulandığı görülmektedir. Kod: Console. WriteLine ; var result = from person in where person. Salary <= 1000 select person; foreach Console. WriteLine("\t \t ", r. Name, r. Salary); Bu kez dynamic liste içerisindeki nesnelerden Salary özelliği 1000 birime eşit ve az olanların çekilmesi için bir LINQ ifadesi kullanılmaktadır. Çalışma zamanındaki sonuç aşağıdaki gibi olacaktır. Daha neler yapabilir? Acaba tanımladığımız ExpandoObject tipinden nesne için bir olay ekleyebilir miyiz? Hımmm... Bu oldukça ilginç olabilir. Aşağıdaki kod parçası ile bir deneyelim bakalım; Kod: static void Main public static void OnSizeChanged { Bu sefer file isimli değişkenin işaret ettiği tipe SizeChanged isimli bir olay bildirimi yapılmaktadır. Event' ler bildiğiniz üzere delegate tipleri ile ilişkilidir. Örnekte basitlik açısından standart EventHandler temsilcisi kullanılmıştır ki dilerseniz farklı handler' ları veya kendi tanımladığınız delegate tiplerini de ele alabilirsiniz. Olayın file nesnesine eklenmesi sırasında birde olay metodunun işaret edildiği görülmektedir. Bildiğiniz üzere bu olay metodu, EventHandler temsilcisinin belirttiği parametrelere ve dönüş tipine sahip olmalıdır. Buna göre OnSizeChanged metodu olayın gerçekleşmesi sonrası devreye girecek olan fonksiyonumuzdur. Çok doğal olarak olayın bir sebepten tetikleniyor olması gerekir. Örnekte Size değerinin 5000' in üzerinde olması durumu değerlendirilmeye çalışılmıştır. Eğer böyle bir koşul oluşur ve e ile ifade edilen olay file nesnesine daha önceden ilave edilirse söz konu olay metodu tetiklenecektir. Aslında uygulamayı Debug ettiğimizde söz konusu olay metodu için MulticastDelegate kullanıldığını rahatlıkla görebiliriz. Dikkat edileceği üzere dinamik olarak üretilen nesne içerisinde yer alan IDictionary koleksiyonunda Name, Size özellikleri ile birlikte MulticastDelegate tipinden tanımlanmış bir metod bildirimde yer almaktadır. Peki ExpandoObject örneklerini metodlara parametre olarakta geçirebilirmiyiz? Elbette Aşağıdaki kod parçasını gözönüne alalım; Kod: static dynamic file = new ExpandoObject ; static void Main { #region Metoda Parametre Aktarımı file. Name = "DynamicOlmak. txt"; file. Size = 1024; Console. WriteLine("Metod çağrısı öncesi dosya boyutu ", file. Size); Action ; Console. WriteLine("Metod çağrısı sonrası dosya boyutu ", file. Size); #endregion } static void Action { obj. Size += 456; Burada file değişkeni sınıf seviyesinde tanımlanmıştır. Tabi örneği Console uygulamasında geliştirdiğimizden dynamic olarak tanımlanan ExpandoObject tipinin başına static anahtar kelimesininde gelmesi gerekmektedir. Bu kodu okurken biraz tuhaflığa neden olmaktadır. ExpandoObject örneği Action metoduna dynamic tipi üzerinden aktarılmaktadır. Dolayısıyla Action metodu içerisinde kullanılan obj değişkeninin file değişkeni olduğunu metod çağrısını yaptığımız yerde belirtmekteyiz. Bu nedenle Action metodu içerisine zaten file değişkeninin geldiğini biliyor olmalıyız. Metod içerisinde sembolik olarak Size değerini arttırmaktayız. İşte çalışma zamanı sonucu; ExpandoObject tipi görüldüğü üzere dinamik olarak tiplerin oluşturulması, onlara üye tanımlanması , özelliklerine değer atanması gibi işlemleri yapabilmemize olanak sağlamaktadır. Bu anlamda test senaryolarında stub veya moc nesneler için kullanılabilecek bir yenilik olarak düşünebiliriz belkide. Aklıma ilk gelen kullanım alanın bu olması, belkide The Art of Unit Testing kitabını okuyor olmamadan da kaynaklanabilir. Aslında söz konusu yeniliği tanımak, kavramak ve gerçek hayat senaryolarındaki yerini anlamak için biraz daha araştırma yapmamız, çalışmamız gerektiği ortadadır. En azından benim... Yazar: Burak Selim Şenyurt..

Açıkça Microsoft Delphiyi yok etmek için. Net çıkardı. Bunu da zaten hiçbir zaman yorumlarında eksiltmedi. Amacımız Delphi kullanıcıları demişti bi ara. Bunu çok iyi başardılar, özellikle Borland Delphi'yi Code Gear a sattıktan sonra tamamen kazanan Microsoft oldu. Delphi 2010'un gelişmesi belirgin bir şekilde değil. Bunlarda eklenince Visual Studio tek platform kalıyor. Napalım, kullanmak zorundayız

Kesinlikle, javaya hayranım. 11 Eylül de en çok etkilenen Sun 'dı ama inanılmaz geliştirdiler sanki etkilenmemiş gibi. Onu tahtından indiremez. Ama benim gönül tahtımdan da Delphi 7 yi kimse indiremez. Hala geçerliliğini koruyor

Language Integrated Query, ben 2007'den bu yana takip ediyorum.. Süper bir anlatım var bu konuyla ilgili arşivimde.. Zaten hayran kalmamak mümkün değil.. Takip etmek inan zor.. O kdr çok makale çıkıyor ki hayretle okuyorum.. Birçok kişi "tanıdığım" . net'i tercih etmemişti ama şuan. net'e doyamıyorlar.. Bu arada yorumun için çok teşekkür ederim..