Visual Studio 2017 İle Gelen Yenikler Webinar Etkinliği
Selamlar;
Öncelikle webinar’a katılan tüm arkadaşlara teşekkür ederim. Umarım sizin için faydalı olmuştur. Kaçıranlar için webinar kaydı ve kodları aşağıdadır. Bir de öneri bölümü var :)
Visual Studio 2017 Rc sürümü ile C# 7.0’da karşımıza çıkan yeni özellikleri, baştan sona güzel bir projeyi kodlayarak inceledik.
Konular:
- Kendimi Tanıtım.
- Out Variables
- Local Functions
- Tuples
- Pattern Matching (Switch)
- Ref Returns Ve Locals
- Deconstruction
- Literal improvements
Webinar Kaydı:
Proje: Visual Studio 2017 RC’de oluşturulan Windows Application bir uygulamada, 2 farklı tipde (GIF-IMAGE) şeklinde seçilebilen dosyaları, C#7.0 ile gelen yeni özellikler ile belirtilen boyutlarda scale işlemine tabi tutup ekrana basacağız.
Aşağıdaki örnek de görüldüğü gibi “TryParse()” içinde kullanılan out parametreleri (“widthInt ve heightInt“) gene kendi içinde tanımlana bilmiştir. “Out Variables” sayesinde önceden olduğu gibi, ilgili parametrelerin dışarda tanımlama zorunluluğu ortadan kaldırılmıştır.
1 2 |
int.TryParse(txtWidth.Text, out int widthInt); int.TryParse(txtHeight.Text, out int heightInt); |
Aşağıdaki örnek de görüldüğü gibi “ScaleImage()” Local Function “button2_Click()” methodu içerisinde yaratılıp çağrılabilmiştir. Kısaca Local Functionlar bize method içinde method çağrabilme imkanı sunmaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
private void button2_Click(object sender, EventArgs e) { int.TryParse(txtWidth.Text, out int widthInt); int.TryParse(txtHeight.Text, out int heightInt); try { var result = ScaleImage(type); ScaleImage(IFType fileType) { //DoSomething(); } } catch{} } |
Aşağıda görüldüğü gibi “ScaleImage()” methodu Tuples sayesinde 2 parametre dönmüştür “(var boolResult, string flName)“. Kısaca Tuples bize bir methodda birden çok parametere geri dönebilmeyi sağlamaktadır. Dönen değer result değişkenine aktarılmış ve daha sonra “result.fileName” şeklinde ilgili sonuca ulaşılabilmiştir.
1 2 |
var result = ScaleImage(type); pictureBox1.Load(result.fileName); |
1 2 3 4 |
(bool boolResult, string flName) ScaleImage(IFType fileType) { //DoSomething(); } |
Deconstruction Tuples: Yukarıdaki örnekde tanımlanan “ScaleImage()” methoduna göre dönen değerler, yine parantez içinde “(var boolResult, string flName)” şeklinde doğrudan değişkenlere aktarılabilmekte ve ilgili değişkenler aşağıda “flName“‘de olduğu gibi başka bir nesneye atanmadan kullanılabilmektedir.
1 2 |
(var boolResult, string flName) = ScaleImage(type); pictureBox1.Load(flName); |
Aşağıdaki örnekde de görüldüğü gibi, “switch” yapısında ilgili gelen sınıf “case“‘de direk olarak kullanılmış ve bir “t” değişkenine atanmıştır. İlgili sınıf tipine göre farklı işlemler yapılmıştır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
switch (fileType) { case Gif t: { //DoSomething(); break; } case Image t: { //DoSomething(); break; } } interface IFType { int Width { get; set; } int Height { get; set; } } public class Image : IFType { public int Width { get; set; } public int Height { get; set; } public string ImageName { get; set; } } public class Gif : IFType { public int Width { get; set; } public int Height { get; set; } public string GifName { get; set; } } |
Geldik en sevdiğim yeniliğe. Aşağıdaki örnekte “SizeArray[]” dizisi içerisinden bir eleman random olarak seçilmekte ve “ref” keyword’ü ile”size” değişkenine, değerinin aksine adresi ile birlikte atanmaktadır. Daha sonra ilgili “size” değişkeni değiştirildiğinde, aktarılan “SizeArray[]” dizisinin ‘n inci değeri de değişmektedir. Kısaca “ref” ile Dizinin’ini değeri değil adresi aktarılmakta ve “Remove(), Insert()” komutlarına gerek kalmadan ilgili dizi elemanın değeri değiştirilebilmektedir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="pl-k">public</span> String[] <span class="pl-en">SizeArray</span> { <span class="pl-k">get</span>; <span class="pl-k">set</span>; } = <span class="pl-k">new</span> String[] { <span class="pl-s"><span class="pl-pds">"</span>100x100<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>200x200<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>300x300<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>400x400<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>500x500<span class="pl-pds">"</span></span> }; Random rnd = new Random(); int rowNum = rnd.Next(1, 5); ref string size = ref GetRandomSize(rowNum); rndWidth.Text = size.Split('x')[0]; rndHeight.Text = size.Split('x')[1]; size = "121x17"; MessageBox.Show(SizeArray[rowNum]); ref string GetRandomSize(int rowNumber) { return ref SizeArray[rowNumber]; } |
2.Örnek: Var olan “array[]” isim listesinden “Engin” ismine ait item’ın index’i bulunup, ilgili değer “ref” ile “place” değişkenine aktarılır. Ve daha sonra, ilgili değişken “Engin Polat” olarak değiştirildiğinde, isim dizisine ait bulunan i’inci elemanın da “Engin Polat” olarak değiştiği görülür.
Webinar Düzeltmeleri:
- “size.IgnoreAspectRatio = false“; ile ilgili dosyalar scale edilirken AspectRatio korunmuş ve girilen “Width” değeri sabit tutularak scale işlemi yapılmıştır. Doğrusu “size.IgnoreAspectRatio = true” olmalıdır.
- Tuple Maximum olarak 7 değil 8 parametreye kadar dönüş yapabilmektedir.
Olsa Güzel Olur Diye Düşündüğüm Bir Özellik: Aşağıdaki örnek kesinlikle çalışmamaktadır. Kodlarda görüldüğü gibi “ref” şeklinde “Tuples” değeri dönülmesi amaçlanmıştır. Dönüş değeri 2 farklı yöntem ile alınabilmesi düşünülmüştür. Böylece ilgili dizi elemanı ve (width, height) özellikleri çekildikten sonra, çekilen dizi elemanına kolaylıkla yeni değer atanabilmektedir. Sizin de bu yaklaşım şekline olan düşüncelerinizi ve varsa yeni fikirlerinizi yorumlar kısmında bekliyorum.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
private void button3Impossible_Click(object sender, EventArgs e) { Random rnd = new Random(); int rowNum = rnd.Next(1, 5); //(ref string size,int width,int height) = (ref,,) GetRandomSizeImpossible(rowNum); (ref string resize, int width, int height) = ref GetRandomSizeImpossible(rowNum); resize = rndWidth.Text+"x" + rndHeight.Text; MessageBox.Show(SizeArray[rowNum]); (ref string, int width, int height) GetRandomSizeImpossible(int rowNumber) { int.TryParse(SizeArray[rowNumber].Split('x')[0], out int w); int.TryParse(SizeArray[rowNumber].Split('x')[1], out int h); return (ref SizeArray[rowNumber], w, h); } |
Böylece geldik bir makalenin ve Webinarın daha sonuna. Halen RC sürümü olan Visual Studio 2017 üzerine bolca konuştuk. Bakalım full sürümünde bizi neler bekleyecek.
Yeni bir makalede görüşmek üzere hoşçakalın.
Source Code: https://github.com/borakasmer/VisualStudio2017Features
Hocam ellerinize sağlık, öyle bir iyi oldu ki aslında bu videoyu yayınlamanız, en kısa zamanda tamamen izleyeceğim. Ama bir şey merak ettim neden hala Win7? :)
Hahaha Teşekkürler Samet,
Visual Studio 2017’nin 7’si :) Şaka bir yana, Ben Mac kullanıyorum. Microfonunda sorun vardı. Ev halkının laptop’u ile Webinarı verdim :) Facebook, Okey makinası:)
Bu arada dikkat süper. Umarım konularıda böyle dikkatli izlersin.
İyi çalışmalar.
Güncel bilgileri takip etmek adına çok güzel bir çalışma olmuş.
Emeğinize sağlık
Teşekkürler Melih,
İşine yaradı ise ne mutlu bana:)
İyi çalışmalar.
Selamlar çok başarılı bir çalışma olmuş Teşekkürler ..
Selamlar Hakan,
Ben teşekkür ederim..