Microsoft .Net Framework 3.5 İncelemesi : C# 3.0 ve VB 9.0 dil geliştirmeleri
Microsoft .Net Framework 3.5, beraberinde bir sürü iyileştirme ve yeni dil özellikleri getiriyor. Bu yazıda an itibarıyla yayınlanan Beta 2 sürümü ile gelen özellikleri inceleyeceğiz. Microsoft .NET Framework 3.5 Beta 2 sürümü
bu adresten indirilebilir.
İnceleyeceğimiz özellikler:
1. Automatic Properties
2. Object Initializers
3. Collection Initializers
4. Extension Methods1. Automatic PropertiesAutomatic Properties (otomatik özellikler), uygulamalarımızda kullandığımız sınıfların (class) tanımlamalarında bize kolaylık sağlayan bir geliştirmedir. Bu geliştirme sayesinde private field'lar tanımlamadan property'lerimizi tanımlayabilir ve kullanabiliriz. Hemen örnekle açıklayalım. .Net 2.0 altında yazılmış bir Student sınıfımız olsun :
public class Student
{
private string name;
private string surname;
private int age;
private string studentNumber;
public string Name
{
get { return name; }
set { name = value; }
}
public string Surname
{
get { return surname; }
set { surname = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
public string StudentNumber
{
get { return studentNumber; }
set { studentNumber = value; }
}
}
Görüldüğü gibi dört farklı property tanımlayabilmek için boşlukları saymazsak tam 27 satır kod yazdık. Bu sınıf .Net 3.5 altında Automatic Properties sayesinde şöyle yazılabilir :
public class Student
{
public string Name { get; set; }
public string Surname { get; set; }
public int Age { get; set; }
public string StudentNumber { get; set; }
}
Aynı sınıfı sadece 7 satır kod ile yeniden yazdık. Satır sayısının 27'den 7'ye indiğine dikkat edin.
.Net 3.5 C# derleyicisi bu şekilde tanımlanmış bir sınıf gördüğünde private field'leri bizim için otomatik olarak tanımlamakta ve ilgili public property'ler ile ilişkilendirmektedir. Yani kısaca, bir sınıf tanımlarken artık sadece property'leri tanımlamak yeterlidir. 30 küsur property içeren bir sınıf tanımladığınızda Automatic Property özelliğini çok seveceksiniz.
Bu özellik sadece C# derleyicisinde geçerlidir.
2. Object InitializersBir önceki örneğimizde tanımladığımız Student sınıfımızı kullanarak yeni bir Student objesi yaratalım. .NET 2.0 altında ilgili kod aşağıdaki gibi olmalıdır :
Student std1 = new Student();
std1.Name = "Ahmet";
std1.Surname = "Demir";
std1.Age = 19;
std1.StudentNumber = "8935";
Student std2 = new Student();
std2.Name = "Mehmet";
std2.Surname = "Yılmaz";
std2.Age = 18;
std2.StudentNumber = "3252";
Aynı işlevi gören kodu .NET 3.5 altında şöyle yazabiliriz:
Student std1 = new Student {Name="Ahmet", Surname = "Demir", Age = 19, StudentNumber = "8935"};
Student std2 = new Student {Name="Mehmet", Surname = "Yılmaz", Age = 18, StudentNumber = "3252"};
Bu özellik hem C# hem de VB derleyicilerinde geçerlidir.
3. Collection InitializersYine Student sınıfımızdan yola çıkarak şöyle bir senaryo geliştirelim. İki farklı öğrencinin bilgilerini tutan bir Generic List oluşturalım. Oluşturduğumuz bu List<Student>'i öğrenci bilgilerini kaydetmek veya güncellemek için kullanabiliriz.
.Net 2.0 altında List<Student> generic listemizi oluşturalım :
Student std1 = new Student();
std1.Name = "Ahmet";
std1.Surname = "Demir";
std1.Age = 19;
std1.StudentNumber = "8935";
Student std2 = new Student();
std2.Name = "Mehmet";
std2.Surname = "Yılmaz";
std2.Age = 18;
std2.StudentNumber = "3252";
List<Student> studentList = new List<Student>();
studentList.Add(std1);
studentList.Add(std2);
.....
.Net 3.5 altında aynı işlevi gerçekleştirelim :
List<Student> studentList = new List<Student> {
new Student {Name="Ahmet", Surname = "Demir", Age = 19, StudentNumber = "8935"},
new Student {Name="Mehmet", Surname = "Yılmaz", Age = 18, StudentNumber = "3252"}
};
Bu özellik hem C# hem de VB derleyicilerinde geçerlidir.
4. Extension MethodsExtension Methods, mevcut bir sınıfımızı, sınıfı oluşturan kod üzerinde hiçbir değişiklik yapmadan extend etmemize (geliştirmemize) yarayan çok kullanışlı bir geliştirmedir. Bir Extension method, mevcut bir CLR tipi üzerinde işlem yapmaya yarayan static bir metotdur. Ayrıca tüm extension metotları yine static tanımlanan bir sınıf içerisinde olmalıdır.
Hemen bir örnekle açıklayalım: Uygulamamız içinde vergi hesaplamaları yaptığımızı varsayalım. GetTaxNumber adında bir metodumuz olsun ve bu metot kendi içinde özel hesaplamalar yaparak aylık vergi tutarını döndürsün.
public static class CustomExtensionMethods
{
public static decimal GetTaxNumber(this int number)
{
decimal tax = 0.18M;
return (number * tax / 12);
}
}
Tanımladığımız metodumuzu kullanalım :
using CustomExtensionMethods;
public partial class testclass()
{
private void test()
{
int salary = 1000;
decimal taxMonthly = salary.GetTaxNumber();
}
}
Bu özellik hem C# hem de VB derleyicilerinde geçerlidir.
Bu yazıda Microsoft Net Framework 3.5'un yazılım dünyasına getirdiği yenilikleri ele aldık. Şüphesiz geliştirmeler sadece bunlarla sınırlı değil.
Implicitly typed local variables, Anonymous Types, Lambda expressions, Query expressions, Expression Trees gibi diğer önemli geliştirmeleri başka bir yazıda inceleyeceğiz.
.Net Framework Yamaları
Microsoft .Net Framework içerisinde yer alan açıklar için bir yama paketi yayınladı. Bir çoğu kritik seviyede olan açıklar için yamaları
bu adresten indirebilirsiniz.
Kapatılan açıklar genelde Remote Code Execution (Uzaktan kod çalıştırma) ile ilgili. Microsoft yamaları .NET framework ve işletim sistemi versiyonlarına göre yayınlayarak takdire şayan bir iş yapmış. Diğer taraftan Security Assessment firması .NET framework için
Null Byte Injection Vulnerabilities (Sıfır Byte Ekleme Açıkları) dökümanı yayınladı. Mutlaka indirmenizi ve örnekleri incelemenizi öneriyorum.
Dökümandan bir alıntı yaparsak :
It was found that certain .NET methods in various sections of the .NET namespace are vulnerable to Null byte injection attacks. Null byte injection occurs when the .NET CLR incorrectly handles user supplied Null bytes.
The .NET CLR considers Null bytes as 'data', .NET strings are not Null byte terminated. However, native POSIX compliant function calls terminate all strings at the first found Null byte. Interoperability issues are encountered when data containing a Null byte is used by .NET to directly call a native C function call.
Native function calls terminate strings at the injected Null byte allowing a remote user to arbitrarily terminate a string parameter used by the vulnerable method.
Security-Assessment.com has discovered five vulnerable methods in the .NET framework which are exploited through Null byte injection. Three of the discovered vulnerabilities allow strings to be arbitrary terminated through String Termination vulnerabilities. The remaining two resulted in an Arbitrary File Disclosure condition where a remote user is capable of accessing arbitrary files from within the web root.
Yukarıda söz edilen beş metot arasında dinamik dizin yolu (path) oluşturmaya yarayan Server.MapPath, metinleri birbirleriyle kıyaslayan String.Compare gibi sık kullanılan fonksiyonlar var.
Bu açıktaki temel neden .Net framework'un string değişkenler içerisinde bulduğu ilk Null byte'da (%00) string'i kesmesidir.
string str = "küresel%00" + " ısınma";
kodu çalıştırılırsa sonuç "küresel" olacaktır.
Bu açık kullanıcıdan gelen verilerle yapılan işlemlerde sorunlar yaratabilmektedir.
Security-Assessment.com yayınladığı döküman içerisinde bu konuda güzel örneklere yer veriyor. Dökümanı incelemenizi tekrar tavsiye ediyorum.