29 Mart 2019 Cuma

App.config Değişiklikleri Görmüyor Problemi


Merhaba, benim başıma gelmiş bir problemi sizinle paylaşmak istedim.

Visual Studio ile bir windows forms application yazdım ve bazı config değerlerini App.config dosyasında sakladım. Proje build olduktan sonra App.config dosyasındaki bazı değerleri değiştirdim bir baktım ki yeni değerleri görmüyor. Ancak yeniden build ettikten sonra gördü. Bunun sebebi ise şu, program klasöründeki App.config dosyasını değil de exe'nin bulunduğu klasördeki config dosyasını değiştirmeniz gerekiyor. Örneğin, telefondefteri.exe adında bir exe oluşmuş olsun. Bu exe'nin bulunduğu klasörde de telefondefteri.exe.config dosyası oluştuğunu göreceksiniz. Değişikliğinizi burda yapmanız gerekiyor. Yaptıktan sonra, projeyi build etmeden de değişikiğinizin anında yansıdığını göreceksiniz.

Umarım faydalı olabilmişimdir...

Hepinize iyi kodlamalar... :)
Paylaş:

18 Haziran 2018 Pazartesi

SQL CROSS APPLY Nedir?


Genelde CROSS APPLY olayını açıklayıcı anlatan Türkçe kaynak pek yok. Ben dilim döndüğünce anlatmaya çalışacağım.

Bir örnekle açıklamak iyi olacak: Diyelimki yöneticiniz sizden her personelin ofise son 2 giriş tarihlerini istedi diyelim. Bu durumda muhtemelen ilk aklınıza gelen, ne var ki her personel için SELECT TOP 2 * FROM XXX ORDER BY GIRIS_TARIHI DESC gibi bir sorgu yazar veririm dersiniz di mi? Bu örneği kafanızda iyice canlandırın. Bu sonucu nasıl çekebilirsiniz? Her personelin son 2 giriş tarihi... Eğer bizden istenen tek bir personelin son 2 giriş tarihi olsaydı işimiz gayet kolaydı. Araya bir WHERE koşulu koyup PERSONEL_ID = 123 vb olanı getir derdiniz ama yöneticiniz tüm personel listesini istiyor. CROSS APPLY olmadan mutlaka herkesin bir çözümü olacaktır ama hiçbir çözüm CROSS APPLY kadar verimli olmayacaktır. Ayrıca CROSS APPLY bu işi oldukça pratik ve hızlı çözüyor.

Basit düşünelim, 2 tane tablomuz olsun: PERSONEL ve PERSONEL_GIRIS diye 2 tane tablomuz olsun. PERSONEL tablosunda personel bilgileri, ID, Adı Soyadı gibi, PERSONEL_GIRIS tablosunda da bu personellerin giriş tarihleri tutuluyor olsun. Her bir personel için n tane giriş. Log tablosu gibi düşünelim bunu. Personellerin giriş logu tutulan bir tablo gibi düşünelim.

PERSONEL tablomuzda aşağıdaki gibi veriler olsun:





PERSONEL_GIRIS tablomuz da aşağıdaki gibi olsun:




Bu durumda her bir personelin son 2 giriş tarihi aşağıdaki sorguyla kolayca bulunabilir:



Yukardaki sorguya dikkat ederseniz; CROSS APPLY için yazılan kısımda WHERE PG.PERSONEL_ID = PERSONEL.ID eşleştirmesi yaptık. CROSS APPLY içindeki tablo ile dışardaki tablo PERSONEL_ID ile joinleniyor. Böylece doğru personel eşleşmesi yapılmış oluyor. Aynı ifadede CROSS APPLY yerine INNER JOIN olsaydı içerde TOP 2 çekmek isteyen ifadeyle böyle bir eşleşmeye izin vermeyecekti. CORSS APPLY ile INNER JOIN arasındaki temel fark burda.  Ayrıca LOG_TBL kullanımına dikkat ediniz.

Eğer ki son 2 giriş değil de son 1 giriş istenseydi, TOP 2 yerine TOP 1 diyecektik. Aradaki farkı görüp daha da anlaşılması açısından aşağıdaki sonucu da yazıyorum:


Görüleceği üzere sadece son girişler getirildi. Çoğu zaman CROSS APPLY sonucunu döndüren TABLE cinsinden function da yazılır. Bunun da yukardaki örneklerden hiçbir farkı yok, sadece CROSS APPLY içine yazılan sorgu bir function'a taşınmış olur o kadar. Bu örnekleri çoğaltabiliriz.

Umarım faydalı olabilmişimdir...




Paylaş:

7 Mart 2018 Çarşamba

C# Using Disposable Kullanımı


usingin bir kullanım şeklini biliyorsunuz namespace dahil ederken kullanılır. Bu yazıda ise Disposable ile ilgili kullanımını anlatacağım.

Bildiğiniz üzere C# kendi içinde bir garbage collection mekanizmasına sahiptir. Garbage collection da bildiğiniz üzere, en kaba tabirle çöp toplama makinesi gibidir. Siz bir değişken tanımladığınızda, ister bir değer atayın, ister bir referans atayın derleyici bunun için bellekte bir yer ayırır ve o değişkenle işiniz bitince eğer onu yok etmezseniz daha sonra derleyici, belli bir kurala göre bu bellekte kalan artıkları bahsettiğimiz çöp toplama makinesi gibi çalışan garbage collection mekanizması ile temizler. Fakat bazen çok yoğun çalışan programlarda bir nedenle bu çöp toplama mekanizması geç kalabilir ve dolayısıyla belleğin şişmesine ve performansın düşmesine sebebiyet verebilir. Bu durumlarda kendi çöpümüzü kendimiz toplamız en güzel yoldur. İşte tam bu aşamada using kullanımı devreye girer. using kullandığımız zaman ilgili blokta işimiz bittiği anda, bellek temizleme mekanizması otomatikmen çalışacak ve belleğin şişmesi ve performansın yavaşlaması durumu böylece ortadan kalkacaktır. Peki using bunu nasıl yerine getirir? Öncelikle using ile kullanılacak bir nesne System.IDisposable arabiriminden türemiş olmalıdır. Böylelikle kullanılan blokta, bloktan çıkıldığı anda otomatikmen Dispose() metodu çağrılacak ve temizleme işi başlayacaktır. Böylece bu işi derleyiciye bırakmamış oluruz.


class UseUsing { static void Main() { StreamReader sr = new StreamReader("deneme.txt"); using (sr){ //sr nesnesini kullan //...... } //veya using (StreamReader sr2 = new StreamReader ("deneme.txt")){ //sr2 nesnesini kullan //....... } } }



Yukardaki örnekte StreamReader sınıfı IDisposable arabirimini uyguladığından bloktan çıkıldığı anda Dispose() metodu arka planda çalışacak ve sr ve sr2 nesneleri yok edilecek ve sizin ekstra bişey yapmanıza gerek kalmayacaktır.


Kısaca using ifadesi Disposable yöntemler kullanmamıza olanak tanır.

Faydalı olması dileğiyle...

İyi kodlamalar dilerim..


Paylaş:

28 Şubat 2018 Çarşamba

C# readonly ve const ifadeleri

readonly anahtar sözcüğü


Birçok yerde readonly ifadesini görmüşsünüzdür. readonly olarak tanımlanan bir değişken yalnızca okunmak üzere tanımlanır ve yalnızca 2 şekilde değer ataması yapılabilir.

  1. İlk tanımlandığında değer ataması yapılarak
  2. Bir constructor içinde değer ataması yapılarak
Yukardaki 2 durum hariç readonly değişkenine değer ataması yapılamaz.

Bu durum, aslında sadece bir yapılandırıcı tarafından değer ataması yapılması gerektiği durumlarda kullanışlıdır. Böylece daha sonra değer değiştirmesi önlenmiş olur. Kullanım alanı oldukça fazladır.

Aşağıdaki örneği inceleyelim:


class DenemeClass { readonly double x = 30; public DenemeClass(int _x) { x = _x; //İlk değer ataması yapıldı x = x * 5; //Burda değeri değiştiriliyor. Doğru ifade çünkü constructor içindeyiz. } public DenemeClass(double _x) { x = _x; } public void Show() { Console.WriteLine(x); } static void Main() { DenemeClass dc = new DenemeClass(10); dc.Show(); DenemeClass dc2 = new DenemeClass(10.2); dc2.Show(); dc2.x = 10.3;//HATA!! Burada "A readonly field cannot be assigned to
(except in a constructor or a variable initializer)" hatası alacaksınız.
Console.Read(); } }





Yukardaki örnekte dc2.x = 10.3; ataması yapıldığında program kızacaktır. Çünkü bir readonly değişken, hata açıklamasında yazdığı üzere sadece ilk değer atamasında ya da bir constructor'da set edilebilir.

const anahtar sözcüğü

Yukarda readonly ifadesini açıkladık. const da aslında readonly'e benzer özellikler gösterir. Aralarındaki fark, const ifadesi yalnızca ilk değer atamasında değer verilip daha sonra program boyunca tekrar değiştirilemeyecektir. Ayrıca ilk değer ataması zorunludur.

const int a; //HATA!! Değer ataması yapılmalıdır const int a = 10; //Doğru ifade. . . . a = 20; //HATA!! const bir değişken daha sonra değiştirilemez.

readonly ile const arasındaki farkı da bu şekilde açıklamış olduk.

Bir sonraki yazıda görüşmek üzere...

İyi kodlamalar dilerim..


Paylaş:

14 Şubat 2018 Çarşamba

C# Dynamic Tipler


C# bilindiği üzere sıkı tip denetimli bir dildir. Bu şu demek oluyor: Eğer bir tip derleme sırasında atandığı bir tip ile uyuşmuyorsa derleme başarısız olacak (hata verecek) demektir. Bazen derleme zamanında da değişken tipli tanımlamalara ihtiyaç olabilir. C# 4.0 bu esnekliği sağlamak için yeni bir tip eklemiştir: dynamic tipi. dynamic tipi tabiri caizse kılıktan kılığa girebilir, bukalemun gibi renk değiştirebilir :) dynamic tipi bütün tiplere dönüştürülebilir. Eee C#1.0'la gelen object tipi de bize bu esnekliği sağlıyordu ne gerek vardı derseniz onu da birazdan anlatacağım.

Aşağıdaki örnekle başlayalım:

class DynamicTypes { static void Main() { dynamic i; dynamic s; i = 10; s = "Bu bir string'tir"; Console.WriteLine("i'nin tipi: " + i.GetType()); Console.WriteLine("i'nin değeri: " + i); //i'ye int tipiymiş gibi davranalım. i = i * 10; Console.WriteLine("i'nin yeni değeri: " + i); Console.WriteLine("str'nin tipi: " + s.GetType()); Console.WriteLine("str'nin değeri: " + s); //s'ye string tipiymiş gibi davranalım. s = s.ToUpper(); Console.WriteLine("s'nin yeni değeri: " + s); i = "i'nin tipi değişti";//Bu atamayla i'nin tipi otomatik olarak değişti Console.WriteLine("i'nin değeri: " + i); Console.WriteLine("i'nin yeni tipi: " + i.GetType()); } }

Bu ekranın çıktısı aşağıdaki gibi olacaktır:

i'nin tipi: System.Int32
i'nin değeri: 10
i'nin yeni değeri: 100

str'nin tipi: System.String
str'nin değeri: Bu bir string'tir
s'nin yeni değeri: BU BİR STRİNG'TİR

i'nin değeri: i'nin tipi değişti
i'nin yeni tipi: System.String

Bu programı biraz yakından inceleyelim:

Öncelikle; dynamic i; diye bir değişken tanımladık. i'ye 10 değerini atadık. Derleyici bunun tipini otomatik olarak int olarak algıladı (int olduğunu i.GetType() ile yazdırınca gördük). Çünkü 10 int tipindedir. Aynı şey dynamic s için de geçerli. Atanan değer karakter katarı olduğundan otomatik olarak string tip algılaması yapıldı. Fakat şu noktaya özellikle dikkat edelim: ilerleyen satırlarda int tipinde olan i değişkenine string bir değer ataması yapılıyor. Derleyici bunu derlemekle birlikte, üstelik çalışma zamanında da hata vermedi. i'nin bundan sonraki tipi string oldu.

dynamic tipi, tip uyumsuzluğu derleme sırasında anlaşılamaz. Ancak çalışma zamanında tip uyumsuzluğu ortaya çıkarsa exception fırlatır. Örneğin aşağıdaki kod derleme zamanında hata almaz ama çalışma zamanında tip uyumsuzluğu hatası fırlatır.

dynamic s; s = "karakter katarı"; s = s * 2; //Çalışma zamanı hatası!! string ile int çarpılamaz!!

Önce dynamic tip string tipine dönüşüyor. Sonra 2 ile çarpılmaya çalışıyor. string ile int haliyle çarpılamaz ve hata fırlatır.

Buraya kadar dynamic tipin ne olduğunu az çok anladık. Şimdi gelelim dynamic ile object arasındaki farklara..

dynamic ile object Tipleri Arasındaki Fark


dynamic ile object arasındaki en temel fark, derleme zamanındaki tip uyumsuzluğu kontrolüdür. Bildiğiniz üzere object tipini kullanabilmemiz için unboxing (kutudan çıkarma) yapmamız gerekiyor. Yani bir tip object olarak tanımlanmışsa, karşı tarafta bunun tipinin ne olacağını belirtmeliyiz.

Console.WriteLine(obj.GetType());//int yazar obj = obj + 1; //Derleme hatası!!! obj'nin tipini belirtmeliyiz obj = (int)obj + 1; //Şimdi çalıştı...

Fakat dynamic tipi için böyle bir işleme gerek yok. dynamic tipler derleme sırasında hata almazken, object tipler için ise unboxing yapmalı, tipini açıkça belirtmeliyiz. Kısaca dynamic tipler bizi derleme hataları zahmetinden kurtarmaktadır. Fakat dynamic tipler her zaman güvenli bir program sunmayabilirler. Dikkatli kullanılmadığında çalışma zamanı hatalarına yol açabilirler. Bundan dynamic tipleri kullanmaktan kaçınmalıyız anlamı çıkarılmamalıdır. Tam tersine dynamic tip kullanımı bazen oldukça elverişli ve gerekli olabilmektedir.

var Anahtar Sözcüğü


dynamic tipleri anlatıp var tipinden bahsetmemek olmazdı. var tipi de tıpkı dynamic tipler gibi herhangi bir tipte bir değişken değeri olabilir. Temel düzeyde javascript biliyorsanız javascriptteki var tanımlayıcısıyla çok benzerlik gösterir. Peki aralarında ne gibi farklar var?

var ile dynamic Tipler Arasındaki Farklar


Yukarda var tipinin de değişken tiplerde değer alabildiğini ifade etmiştik. dynamic tiplerden bazı farklarla ayrılır. dynamic tipler null olabiliyorken var tipleri mutlaka bir başlangıç değerine sahip olmalıdır. Ayrıca ilk atanan tip neyse program sonlanana kadar aynı tipte olmak zorundadır. Bunu bir örnekle açıklayalım.

dynamic x = null; x = 10; //x int tipinde x = x + 10; //x yine int tipinde x = "string değer"; //Geçerli ifade: x burda string tipine dönüştü. var y = null; //Hata!! null değer ataması yapılamaz! var y = 10; //y değişkeni int tipinde bir ilk değer almıştır. y = "string değer"; //Hata!! y yukarda ilk değeri int almıştı. string değer ataması yapılamaz

Buraya kadar object, dynamic ve var gibi dinamik tiplerden bahsetttik. Aşağıda bu üç dinamik tip arasındaki farkları tablo halinde bulabilirsiniz.

object, dynamic ve var Arasındaki Farklar


objectdynamicvar
object .NET Framework içindeki herhangi bir tipte bir değişken olabilir.Herhangi bir tipte bir değişken olabilirHerhangi bir tipte bir değişken olabilir fakat bir başlangıç değerine sahip olmalıdır.

Derleyici nesne hakkında bilgi sahibidir.

Derleyici nesne hakkında bilgi sahibi değildir. Intellisense ile "." dan sonra herhangi bir seçenek çıkmaz.

Derleyici nesne hakkında bilgi sahibidir. nesne hangi tipteyse ona göre intellisense ile bilgi edinmek mümkündür.

Bir metoda parametre olarak gönderilebilir veya bir metodun dönüş tipi olabilir.Bir metoda parametre olarak gönderilebilir veya bir metodun dönüş tipi olabilir.Bir metoda parametre olarak geçilemez ya da bir metodun dönüş tipi olamaz.

Tip ataması yapıldığında boxing - unboxing yapılmak zorundadır.Tip dönüşümü (boxing - unboxing) gerekmemektedir.Tip dönüşümü (boxing - unboxing) gerekmemektedir.
unboxing sırasında tip dönüştürülemezse hata fırlatır.

Tip dönüşümü hataları derleme zamanında anlaşılmaz ancak çalışma zamanında tip dönüştürülemezse hata fırlatır.

Tip dönüşümü derleme sırasında gerçekleşir. Hata varsa derleme yapılmaz.

Genel hatlarıyla dynamic tipleri anlatmaya çalıştım.

Umarım faydalı olabilmişimdir...

Hepinize iyi kodlamalar dilerim :)


Paylaş:

13 Şubat 2018 Salı

Visual Basic 6.0 Türkçe Karakter Sorunu (ı-ý, İ-Ý, ş-þ, Ş-Þ, ğ-ð, Ğ-Ð)


Hala Visual Basic 6.0 kullanan var mı bilmiyorum ama bir vesileyle bu aralar kullanmak zorunda kaldım :) Modern programlama dilleri ve IDE'lerini kullandıktan sonra bu tarz eski teknolojilere alışmak bir hayli zaman alıyor.

Neyse gelelim konumuza.. Karşılaştığım bu karakter sorununu belki başkaları da karşılaşmıştır diye belki bir faydam olur diye paylaşmak istedim.

Efsane Visual Basic 6.0 kodunu açtım birşeyler değiştirmem gerekiyor fakat kod sayfasında özellikle ı, ğ, ş harflerinde sorun olduğunu gördüm. Comment bile yazmak istesem abuk sabuk harfler çıkıyor. Region ayarlarından dil ayarlarını kaldırıp tekrar yükledim, klavye ayarlarını kaldırıp tekrar yükledim, server ı restart ettim ama yine düzelmemişti. Çıkan harfler ise aşağıdaki gibiydi.

ı  yerine  ý
İ  yerine  Ý
ş  yerine  þ
Ş  yerine  Þ
ğ  yerine  ð
Ğ  yerine  Ð

Eğer sizde de harfler yukardaki gibi çıkıyorsa o zaman doğru yerdesiniz. Çözümünü ise biraz zor bulmakla birlikte çok kolay olduğunu gördüm. Aşağıdaki yolu izleyip kodun font familysini aşağıdaki gibi değiştiriyorsunuz ve sorun düzeliyor. Açıkçası benim çok zor aklıma geldi font kaynaklı olabileceği.

Visual Basic 6.0 > Tools > Options > Text Editor > Normal Text > Courier New TUR 

Kolay gelsin..


Paylaş:

11 Şubat 2018 Pazar

C# Kısmi Tipler ve Kısmi Metotlar (Partial Class, Partial Methods)


Merhaba,

Bu yazıda, kısmi tiplerden bahsedeceğim.

Büyük boyutlu programlarda bazen aynı amaçlar için kullanılan çok uzun olabilecek cs dosyalarını bölmek mümkündür. Böylece takibi daha da kolaylaştırmış oluruz. 100'lerce satır arasında kaybolmaktansa bazen birbiriyle bağlantılı 3-5 metot için ayrı cs dosyaları oluşturmamız mümkün olabilir.

Kısmi tipleri belirtmek için partial anahtar sözcüğünü kullanacağız.

Öncelikle 3 ayrı dosyayı ayrı ayrı cs dosyası olarak kaydedelim.


--Bunu PartialClassX.cs olarak kaydedin
partial class PartialClassXY { public int X { get; set; } }


--Bunu PartialClassY.cs olarak kaydedin
partial class PartialClassXY { public int Y { get; set; } 
}

--Bunu PartialClassXY.cs olarak kaydedin
using System; partial class PartialClassXY { public PartialClassXY(int x, int y) { this.X = x; this.Y = y; } static void Main() { PartialClassXY xy = new PartialClassXY(10, 20); Console.WriteLine("X: " + xy.X + " Y: " + xy.Y); } 
}

Programı çalıştırdığınızda aşağıdaki çıktıyı alacaksınız:

X: 10 Y: 20

Örnekte görüldüğü gibi, aynı namespace içinde olmak kaydıyla herhangi bir yerde partial class anahtar sözcüğü ile ortak bir sınıf oluşturmamız mümkündür. Dikkat edildiğinde PartialClassXY.cs dosyasında this.X ve this.Y elemanlarına (PartialClassXY.cs'de tanımlı olmadığı halde) sınıfın elemanlarıymış gibi erişebiliyoruz. Sonuç olarak partial class sayesinde PartialClassX.cs, PartialClassY.cs ve PartialClassXY.cs dosyalarını tek bir çatı altında toplamış olduk.

Kısmi tipler tanımlanabildiği gibi Kısmi Metotlar da tanımlanabilir. Aşağıdaki örnek kısmi metotlara örnektir.
using System; partial class PartialClassXY { public int X { get; set; } partial void Show() { Console.WriteLine("X: " + X + " Y: " + Y); } } partial class PartialClassXY { public int Y { get; set; } public void ShowXY() { Show(); } } partial class PartialClassXY { public PartialClassXY(int x, int y) { this.X = x; this.Y = y; } partial void Show(); } class Test { static void Main() { PartialClassXY xy = new PartialClassXY(10, 20); xy.ShowXY(); Console.Read(); } 
}

Kısmi metodun tanım şekline dikkat ediniz: partial void Show(); 

Diğer parçada ise bu metodun içi doldurulmuştur.
partial void Show() { Console.WriteLine("X: " + X + " Y: " + Y); 
}

Artık bu metot diğer parçalarda çağrılırsa çalışacaktır. Diğer parçada ise bu metot çağrılmıştır.
public void ShowXY() { Show(); 
}

Diyelim ki Show() metodunu derlemeye dahil etmezsek ShowXY() boş çalışacaktır. Kısmi metodun asıl faydası da burda yatmaktadır.

Umarım faydalı olabilmişimdir.

Bir sonraki makalede görüşünceye dek hoşçakalın...


Paylaş:

Bu Blogda Ara