.Net Programlama İpuçları
Son güncelleme 22 Şubat 2009 Pazar
Türkçe string karşılaştırma problemi
.Net Framework'ün String sınıfında yer alan fonksiyonlar çalıştıkları Thread'in kültürünü taban alarak işlem yaparlar. Bu da büyük-küçük harf duyarsız String karşılaştırma işlemlerinde (Compare, Indexof gibi) ve büyük-küçük harf çevrim fonksiyonlarında (Toupper, Tolower gibi) bazı karakterlerde probleme neden oluyor.
Örneğin kültür Türkçe iken,
string.Compare("i", "I", true) == 0
şeklinde büyük-küçük harf duyarsız bir karşılaştırma yaptığınızda sonuç eşit dönmez, False döner.
Bu gibi hataların önüne geçebilmek için ilgili String fonksiyonuna kültür parametresi olarak System.Globalization Namespace'in de yeralan CultureInfo.InvariantCulture Property'si ile erişebileceğimiz gerçek kültürden bağımsız statik CultureInfo'yu vermeliyiz.
String.Compare("i", "I", true, CultureInfo.InvariantCulture) == 0;
ifadesi Thredin gerçek kültürü ne olursa olsun her zaman eşit (True) sonuç verecektir. InvariantCulture'ın sadece büyük-küçük harf duyarsız String karşılaştırma işlemlerinde kullanılması önerilir.
ToLower, ToUpper fonksiyonlarında da duruma göre kullanılmalıdır. Eğer amaç metin çevirmek ise InvariantCulture kullanmaya gerek yok, ama örneğin bir Sql ifadesini büyük harfe çevirmek istersek, "is null" gibi bir ifadeyi InvariantCulture ile çevirmeliyiz, Türkçe kültür ile çevirdiğimizde "İS NULL" şeklinde yanlış çevrilecektir.
Aynı problemi daha kapsamlı örneklendirelim:
yukarıdaki kod çalıştırıldığında aşağıdaki sonucu verecektir:
Kültür : İngilizce, invariant compare eşitliği True, normal compare eşitliği True
Kültür : Türkçe, invariant compare eşitliği True, normal compare eşitliği False
Referans tipli değişken içeren sınıfların kopyasını çıkarmak
Bildiğiniz gibi değişkenler referans ve değer tipleri olmak ikiye ayrılır. Integer, Structure, DateTime gibi nesneler değer tipindendir ve aynı tipten başka bir değişkene atandıklarında kopyaları çıkarılarak bu kopya atanmış olur. Sınıflar ise referans tipindendir, aynı tipten bir değişkene bir sınıf Instance'ı atandığında kopyası oluşturulmaz aynı Instance'ın adresi hedef değişkene atanır. Yani referans tipindeki değişkenler aslında sadece bir adrese sahiptirler. Bir sınıf instance'ını klonlamanız gerektiğinde ise aşağıdaki yöntemi kullanabilirsiniz:
Örnek sınıfımız:
Örnekde görüldüğü gibi bir sınıf içerisinde yine sınıfları refere eden üyeler de olabilir. Bu sınıfı klonlanabilir yapmak için aşağıdaki gibi sınıf tanımımıza Sytem.ICloneable interfaceini ekleyip implemente etmeliyiz:
Clone() fonksiyonu instence'ın kopyasını binary serializasyon/deserializasyon ile elde ediyor. Bu nedenle sınıf tanımının başına "Serializable" Attribute'ünü ekledik.
Örneğimizi yine basit bir test koduyla deneyelim (C# 3.0 ve sonrası için):
Aşağıdaki sonucu verecektir:
d1.Onceki.Degerler[1] = 4 [Orjinal]
d2.Onceki.Degerler[1] = 99 [Kopya]
Web uygulamarında Client ve Server'ın IP adresini elde etmek
Web uygulamalarından client IP adresini elde etmek için:
Request.UserHostAddress();
Web Servisi'nden client IP adresini elde etmek için:
Request.Params["REMOTE_ADDR"]
WCF Servisi'nden client IP adresini elde etmek için:
RemoteEndpointMessageProperty mp = OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string clientAddr = mp.Address; //+ ":" + mp.Port.ToString();
yöntemlerini kullanabilirsiniz. Server IP adresini bulmak için ise:
string serverAddr = Dns.GetHostEntry(System.Environment.MachineName).AddressList[0].ToString();
dikkat ederseniz bu yöntemle Server'ın sahip olduğu ethernetlerden listede ilk geleni alıyoruz bu örnekte (Server birden fazla ethernet barındırabilir).
argelab_dotnet_programlama_ipuclari_ornek_uygulama.zip (41k)
ArgeLab.net, bu sitenin
eksiksiz ve hatasız olduğu
konusunda bir garanti veremez. Bu sitede yer alan bilgilerin ve
programların kullanımı sonucu oluşabilecek zararlardan
sorumlu tutulamaz.