Net 4.6 İle Gelen Yenilikleri Mvc’de İnceleyelim
Selamlar;
Bu makalede Visual Studio 2015 RC ile gelen enson C# 6.0 yeniliklerini inceleyeceğiz. Aşağıda görüldüğü gibi C#’ın tarihçesinde günümüze kadar gelen önemli yenilikleri görmekteyiz. C# 6.0’da bu kadar büyük yenilik bulunmamaktadır. Daha ufak yazım kolaylıkları sağlayan küçük yenilikler ile karşımıza çıkmaktadır. Bu kolaylıklar tabi ki Roslyn olarak adlandırılan tamamen baştan yazılan yeni derleyici ile mümkün bir hal almıştır. Artık old school olarak adlandırılan bu zamana kadar eski derleyecinin değiştirilmemesinden kaynaklanan belli kalıplardan kurtulmanın zamanı gelmiştir.
Daha önceki yazılarımda da bu konuya değinmiştim. Ama bazı özellikler kaldırılmış ve bazıları da değiştirilmiş. Bundan dolayı ben de bu yeni özellikleri size bir mvc projesinde anlatmaya kararverdim.
Öncelikle aşağıda görüldüğü gibi .Net Framework’ü 4.6’ı olan yeni bir web application oluşturulur.
Daha sonra aşağıda görüldüğü gibi MVC bir Template seçilir.
1-) Default Property Atama :
Property tanımlama zamanında default değer atamaya yarar. Örneğin aşağıda tanımlanan Customer class’ı ilk yaratılırken propertylerine herhangi bir değer atanmaz ise Name, Surname ve Age özellikleri çağrılma anında ilk atanan değerler ile karşımıza çıkar.
1 2 3 4 5 6 |
class Customer { public string Name{ get; set; } = "Bora"; public string Surname{ get; set; } = "Kasmer"; public int Age{ get; set; } = 37; } |
HomeController.cs:
1 2 3 4 5 6 7 8 9 10 11 |
namespace Net4._6.Controllers { public class HomeController : Controller { public ActionResult Index() { Customer person = new Customer(); return View(person); } } } |
Index.cshtml:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@{ ViewBag.Title = "Home Page"; } @model Net4._6.Controllers.Customer <div class="jumbotron"> <h1>ASP.NET 4.6</h1> </div> <div class="row"> <b>İsim :</b>@Model.Name<br /> <b>Soyisim: </b>@Model.Surname</br> <b>Yaş: </b>@Model.Age </div> |
Ekran:
2-)Static Members Kullanma:
Aşağıda görüldüğü gibi using kısmına static class eklendiğinde bu class altındaki static methodlara doğrudan erişilebilir. Örneğin Math.Sqrt() yenine Sqrt() şeklinde ilgili method kullanılabilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class Point { public int _x { get; set; } = 5; public int _y { get; set; } = 8; public Point() { } public Point(int x, int y) { _x = x; _y = y; } public double Dist { //get { return Math.Sqrt(_x * _x + _y * _y); } get { return Sqrt(_x * _x + _y * _y); } } } |
3-) String İnterpolasyonlar:
Aşağıda görülen uzun yol olan String.Format’da {0},{1} yazmak yerine bu alanlara direk _x ve _y kordinatlarını yazdırılabilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class Point { public int _x { get; set; } = 5; public int _y { get; set; } = 8; public Point() { } public Point(int x, int y) { _x = x; _y = y; } public double Dist { get { return Sqrt(_x * _x + _y * _y); } } public override string ToString() { return String.Format("({0},{1})", _x, _y); } } |
Yeni yazım şekli: $“({x},{y})” $ ile başlıyan string ifadeler direk {} arasına yazılır.
1 2 3 4 |
public override string ToString() { return $"({_x},{_y})"; } |
4-) Methodlarda Lambda Kullanımı :
İşte geldik benim favori yeniliğime. Lambda expressionları artık methodlarda da kullanabiliriz. Mesela aşağıda return yazmadan direk lambda ile (=>) ile ilgili string result gönderelebilir.
1 |
public override string ToString() => $"({_x},{_y})"; |
Property Tanımlamada Lambda Kullanımı: Aşağıdaki property yerine bir altındaki kod tanımı yapılabilir.
1 2 3 4 |
public double Dist { get { return Sqrt(_x * _x + _y * _y); } } |
Yeni Yazım Şekli: Lambda kullanılarak (=>)hatta get bile kullanılmadan aşağıdaki gibi ilgili property tanımlanabilir.
1 |
public double Dist=> Sqrt(_x * _x + _y * _y); |
5-)Index Atamaları:
Aynı propertylerde olduğu gibi indexleri de yaratılırken kendi içlerinde değerlerini atayabiliriz. Aşağıda bir json object için herbir index değerine eski yol ile tek tek değer atanmıştır.
Eski Yöntem:
1 2 3 4 5 6 7 |
public JObject ToJsonCordinate() { var result = new JObject(); result["startCordinate"] = _x result["endCordinate"] = _y; return result; } |
Yeni Yöntem:
Değişken tanımlanmadan doğrudan değerler tanımlama sırasında atanmıştır.
1 2 3 4 5 |
public JObject ToJsonCordinate() { var result = new JObject() {["startCordinate"] = _x,["endCordinate"] = _y }; return result; } |
6-)Null-Conditional Kontrolü:
Aşağıda json değerleri çekerken herbir değer için null kontrolü yapılmıştır. Böylece ilgili json kordinatlar integer’a pars edilip Point olarak geri döndürülmüştür.
1 2 3 4 5 6 7 8 9 |
if (json != null && json["startCordinate"] != null && json["startCordinate"].Type == JTokenType.Integer && json["endCordinate"] != null && json["endCordinate"].Type == JTokenType.Integer ) { return new Point((int)json["startCordinate"], (int)json["endCordinate"]); } |
Yeni Yöntem:
Burda “?” işareti konarak ilgili nesnenin null kontrolü kolaylıkla yapılmaktadır. Nesne null ise zaten “?” işaretinden sonraki kısıma geçilmez.
1 2 3 4 |
if (json["startCordinate"]?.Type == JTokenType.Integer && json["endCordinate"]?.Type == JTokenType.Integer) { return new Point((int)json["startCordinate"], (int)json["endCordinate"]); } |
7-)Try Catch Filitreleme:
Hata yakalama anında filitreleme yapılabilmektedir. Bu da belirlenen kriterlere göre hata fırlatılmasını sağlamaktadır. Aşağıdaki örnekte “0”‘a bölünme durumunda bölünen sayı 50’den küçük ise “0” değilse “1” değeri dönmesi hata yakalama anında koşul belirlenerek yapılmıştır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public double DivideNumber(int number1, int number2) { try { return number1 / number2; } catch (DivideByZeroException ex) when (number1 >50) { return 1; } catch (DivideByZeroException ex) when (number1 <50) { return 0; } } |
8-)Catch ve Finally’de Await Kullanımı:
Eğer hata fırlatma anında yoğun bir işlem yapılacak ise bunu asenkron çalıştırmak performans anlamında bize büyük kolaylık sağlayabilir. İşte bu noktada aşağıdaki örnekde olduğu gibi hata fırlatma anında loglama ve mail atma işlemleri asenkron yapılabilmektedir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public double DivideNumber(int number1, int number2) { try { return number1 / number2; } catch (DivideByZeroException ex) when (number1 >50) { await LohAsync(ex) return 1; } catch (DivideByZeroException ex) when (number1 <50) { await LogWriteAsync(ex) return 0; } finally { await SendAsyncMailAdmin(); } } |
9-)nameof Keyword’ü:
Aşağıdaki örnekde nameof keyword’ü ile method’a gelen değişken ismi hata mesajı içinde gönderilmektedir. Aşağıdaki kullanım yerine, yeni yöntem olan nameof keyword’ü kullanımı ilerde kodda oluşabilecek değişikliklerde büyük kolaylıklar sağlar.
Eski Yöntem:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public string AddPoint(Point point) { Point cordinateHome; try { cordinateHome = new Point(point._x + 50, point._y + 12); return "Ok"; } catch { string name = "point yanlış gönderilmiştir."; return name; } } |
Yeni yöntem: Bu şekilde kullanımda ilerde parametre ismi değişse bile kod tarafında başka bir değişikliğe gerek kalmamaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public string AddPoint(Point point) { Point cordinateHome; try { cordinateHome = new Point(point._x + 50, point._y + 12); return "Ok"; } catch { string name = nameof(point) +" yanlış gönderilmiştir."; return name; } } |
Primary Constructor denen Classlar ilk yaratılırken constractor değerlerini, method gibi başta alma özelliği şuan için kaldırılmış görülüyor. Örnek kullanım şekli aşağıdaki gibidir.
1 2 3 4 5 |
class Basket(string item, int price) { public string Item { get; } = item; public int Price { get; } = price; } |
Bu değişiklikler yeni derleyici olan Roslyn’in yazılması ile karşımıza çıkan, işe yarar kolaylıklardır. Bu bir son değil başlangıçtır. Roslyn sayesinde daha birçok yeniliğin kapıda olduğunu söylemek hiç de zor değildir.
Geldik bir makalenin daha sonuna. Yeni bir makalede görüşmek üzere hoşçakalın.
Kaynaklar: MSDN, pluralsight.com,Channel9.msdn.com, infoworld.com, stackoverflow.com
Geçen Ekim’de çıkan Java 8 versiyonunda da Lambda yenilikleri dikkat çekiyordu. C# ta aynı şekilde yenilendi. Bu sayede C# ve Java Ruby’nin kullanışlığına kavuştu. Ruby’den bir parantez açarak Scala, Clojure, F# gibi diğer fonksiyonel dilleri de dahil etmeli.
4, 6 ve 8. maddeleri ilk yeni projemde kullanıyor olacağım. Çok teşekkürler.
Selamlar Cem;
Alıntılara borakasmer.com’u yazmışınız.
Teşekkür ederim.