Arşiv

Etiketlenen yazılar method

C# Performans Analiz Sınıfı

20 Kasım 2011 Yorum yapılmamış

Geliştirmekte olduğumuz uygulamalarda performans analizi yapmak için genellikle Stopwatch sınıfını kullanırız.

Aşağıdaki sınıf’ı kullanarak uygulamanın her method‘unu kolay analiz edebiliriz;

public class PerformansAnaliz
{
	public TimeSpan ToplamSure { get; private set; }
	public TimeSpan OrtalamaSure { get; private set; }

	public static PerformansAnaliz Yeni()
	{
		return new PerformansAnaliz();
	}

	public void Olcumle(Action Method, int TekrarAdet = 1)
	{
		var sw = Stopwatch.StartNew();
		for (int iLoop = 0; iLoop < TekrarAdet; iLoop++)
		{
			Method();
		}
		sw.Stop();
		OrtalamaSure = new TimeSpan(sw.Elapsed.Ticks / TekrarAdet);
		ToplamSure = sw.Elapsed;
	}
}

Dosya boyutu almak için Head isteğinde bulunmak

05 Ekim 2011 Yorum yapılmamış

Uygulamalarımızda internet üzerindeki bir dosyanın boyut bilgisine ihtiyacımız olabilir.

Yapmamız gereken; dosyaya istekte bulunup Length özelliğinden dosya boyutu bilgisini almak.

var DosyaKonum = "http://www.enginpolat.com/wp-content/uploads/2011/07/FPSOrnek.rar";

WebClient wc = new WebClient();
var Dosya = wc.DownloadData(DosyaKonum);

int DosyaBoyut = Dosya.Length;

Bu yöntemin en önemli dezavantajı, dosyanın boyut bilgisini alabilmek için dosyayı gerçekten download etmemiz gerekiyor. Özellikle büyük boyutlu dosyalarda bu yöntem büyük problemlere yol açacaktır.

Aslında yapılan isteğin sonucunun Başlık (Header) bilgisinde dosya boyutu yer alıyor. Eğer Başlık‘tan (Header) boyut bilgisine ulaşabilirsek dosyayı download etmemize gerek kalmaz.

var DosyaKonum = "http://www.enginpolat.com/wp-content/uploads/2011/07/FPSOrnek.rar";

var Request = WebRequest.Create(DosyaKonum);

Request.Method = "HEAD";

var Response = Request.GetResponse();

var DosyaBoyut = Response.Headers[HttpResponseHeader.ContentLength];

Öncelikle WebRequest sınıfının static Create() method’u sayesinde, parametresinde adresi verilmiş dosyaya bir istek oluşturuyoruz.

Request değişkeninin GetResponse() method’undan sonuç bilgisini almadan önce Method özelliğine HEAD değerini atıyoruz.

Böylece istek sonucunda, dosyanın içeriğinin değil sadece başlık bilgisinin bulunmasını sağlıyoruz.

HttpResponseHeader enum’ında yeralan ContentLength değeri ile Response değişkeninin Headers özelliğinden dosyanın boyut bilgisine ulaşabiliyoruz.

Bu kodda ne yanlış var? – 9

20 Ağustos 2011 9 yorum

Geliştirmekte olduğumuz bir projede C:\ sürücüsünde bulunan OnemliDosya.xls dosyasını sıkışırmamız ve OnemliDosya.zip dosyasını oluşturmamız istendi.

Hemen arkasından sıkıştırdığımız dosyayı açmamız ve OnemliDosya.Yeni.xls dosyasını oluşturmamız bekleniyor.

Aşağıdaki method’ları bu görev için yazdık;

public static void Compress(string ZiplenecekDosyaAdi, string ZipDosyaAdi)
{
	FileStream InputStream = File.Open(ZiplenecekDosyaAdi, FileMode.Open);
	FileStream OutputStream = File.Open(ZipDosyaAdi, FileMode.Create);
	GZipStream ZipStream = new GZipStream(OutputStream, CompressionMode.Compress);

	try
	{
		byte[] Buffer = new byte[InputStream.Length];
		InputStream.Read(Buffer, 0, Buffer.Length);
		ZipStream.Write(Buffer, 0, Buffer.Length);
	}
	finally
	{
		OutputStream.Close();
		InputStream.Close();
	}
}

public static void Decompress(string ZiplenecekDosyaAdi, string ZipDosyaAdi)
{
	FileStream Input = File.Open(ZiplenecekDosyaAdi, FileMode.Open);
	FileStream Output = File.Open(ZipDosyaAdi, FileMode.Create);
	GZipStream ZipStream = new GZipStream(Input, CompressionMode.Decompress);

	try
	{
		int Data = ZipStream.ReadByte();
		while (Data > 0)
		{
			Output.WriteByte((byte)Data);
			Data = ZipStream.ReadByte();
		}
	}
	finally
	{
		Output.Close();
		Input.Close();
	}
}

Yazdığımız method’ları aşağıdaki gibi kullanıyoruz;

Compress("C:\\OnemliDosya.xls", "C:\\OnemliDosya.zip");
Decompress("C:\\OnemliDosya.zip", "C:\\OnemliDosya.Yeni.xls");

Kodumuzdan emin olmamıza rağmen, çalışmadığını farkediyoruz.

Sizce problem nedir ve nasıl düzeltilebilir?

C# Uygulamanın Yönetici (Administrator) hesabı ile çalıştığını kontrol etmek

16 Ağustos 2011 Yorum yapılmamış

Eğer uygulama içerisinde Yönetici (Administrator) hesabının yetkisi ile yapılabilecek görevlerimiz varsa, öncelikle bu haklara sahip olduğumuza emin olmamız gerekir.

Günümüzde birçok uygulama Yönetici (Administrator) haklarına ihtiyaç duyar. Bu makalede bu haklara sahip olduğumuzu nasıl kontrol edeceğimizi işleyeceğiz.

Öncelikle kodumuzun using kısmına System.Security.Principal namespace‘ini eklememiz gerekiyor;

using System.Security.Principal;

Daha sonra IsAdministrator() isminde bir fonksiyon yazıyoruz;

public static bool IsAdministrator()
{
	WindowsIdentity identity = WindowsIdentity.GetCurrent();

	WindowsPrincipal principal = new WindowsPrincipal(identity);

	return principal.IsInRole(WindowsBuiltInRole.Administrator);
}

Bu fonksiyon sayesinde Yönetici (Administrator) haklarına sahip olup/olmadığımızı anlayabiliyoruz.

Fonksiyon içerisinde öncelikle WindowsIdentity sınıfından bir değişkene WindowsIdentity sınıfının static GetCurrent() methodundan dönen değeri atıyoruz.

İkinci adımda ise, bu değişkeni kullanarak WindowsPrincipal sınıfından yeni bir değişken oluşturuyoruz.

Son adımda, bu değişkenin IsInRole fonksiyonuna WindowsBuiltInRole enum’ından Administrator değerini parametre olarak geçiyoruz ve sonucu fonksiyondan geriye boolean değer olarak döndürüyoruz.

Uygulama içerisinde her ihtiyacımız olduğunda yukarıdaki fonksiyonu çağırarak Yönetici (Administrator) haklarına sahip olduğumuzu kontrol edebiliriz;

bool AdminRole = Program.IsAdministrator();

XNA ile Video Oynatmak

01 Temmuz 2011 Yorum yapılmamış

Bu yazıyı okumadan önce XNA ile Oyun Programlama kategorisindeki diğer yazılarımı okumanızı tavsiye ederim.

Belli bir seviyenin üstündeki her oyunda, oyunu tanıtan, oyuna alışmanızı sağlayan, oyunun hikayesini anlatan veya bölümler arasında bilgi veren videolar vardır.

Oyunun kullanıcılarına, oyunun konusunu okumaları için sayfalarca yazı vermektense, kısa bir video ile anlatmak her zaman daha iyidir.

XNA ile bir video nasıl oynatılır?

Öncelikle oyunumuza ekleyeceğimiz video’nun formatına dikkat etmemiz gerekiyor. Varsayılan olarak, XNA Content Pipeline sadece WMV formatındaki videoları destekler.

XNA ile Oyun Programlama - Content Pipeline Desteklenen Video Formatları

Bir video’yu oyun penceresinde oynatmak için, öncelikle Video sınıfından bir instance‘a oynatacağımız video‘yu yüklememiz lazım.

Daha sonra, XNA Framework ile birlikte gelen VideoPlayer sınıfından bir instance ile, yüklediğimiz video‘yu oynatmaya başlayabiliriz.

Sınıf seviyesinde iki değişken tanımlayarak işe başlıyoruz;

Video v;
VideoPlayer vp;

LoadContent() method’unda değişkenlerimize değer atamalarını yapıyoruz;

v = Content.Load<Video>("OyunBaslangicVideo");
vp = new VideoPlayer();

vp.Play(v);

VideoPlayer tipindeki değişkenin Play() method’unu çağırarak video dosyamızın oynatılmasını sağlıyoruz.

Artık tek yapmamız gereken, Draw() method’unda, oynatılan video‘yu kare kare oyun penceresine çizmek;

spriteBatch.Begin();

spriteBatch.Draw(vp.GetTexture(), Vector2.Zero, Color.Blue);

spriteBatch.End();

XNA, VideoPlayer sınıfının GetTexture() method’u ile oynatılan video’nun o anki karesini Texture2D tipinde kullanmamızı sağlar.

SpriteBatch sınıfının Draw() method’u sayesinde ilgili video karesini oyun penceresine çizebiliriz.

C# method overload nedir?

27 Nisan 2011 Yorum yapılmamış

Method Overload, aynı isme sahip birden fazla method’un olabilmesidir diyebiliriz.

Kural olarak, overload edilmiş method‘lar aynı imza‘ya (signature) sahip olamazlar.

Method İmzası (Method Signature), method’un ismi ve aldığı parametrelerin tipleri/adedidir. Method imzasına, method’un dönüş tipi dahil değildir.

Örnek olarak;

void Topla(int Sayi1, int Sayi2) /// Topla(int, int)
{
}

void Topla(string Isim1, string Isim2) /// Topla(string, string)
{
}

/// Aşağıdaki method, ilk Topla method'u ile aynı imzaya sahip
void Topla(int Rakam1, int Rakam2) /// Topla(int, int)
{
}

Farklı bir örnek;

void EMailGonder(string To, string CC, string Konu, string Mesaj)
{
}

EMailGonder() method‘unu kullanarak, email gönderme işlevini yerine getirebiliriz.

Tek bir alıcı yerine, To kısmının string dizisi (string[]) olması gerektiği durumda, yeni bir method yazmamız, hangi method’u kullanmamız gerektiği konusunda kafa karışıklığına sebep olacaktır.

Method Overload sayesinde, bu kafa karışıklığı ve kod kalabalığından kurtulabiliriz;

void EMailGonder(string[] To, string CC, string Konu, string Mesaj)
{
}

İki method’umuz birlikte;

void EMailGonder(string To, string CC, string Konu, string Mesaj)
{
}

void EMailGonder(string[] To, string CC, string Konu, string Mesaj)
{
}

Artık, EMailGonder() method’unu kullanacağımız zaman, ilk parametreyi string dizisi (string[]) şeklinde verirsek,

void EMailGonder(string[], string, string, string)

imzasına sahip method, ilk parametreyi string olarak verirsek,

void EMailGonder(string, string, string, string)

imzasına sahip olan method çalıştırılacaktır.

C# 4.0 dynamic ve object farkı?

19 Nisan 2011 Yorum yapılmamış

C# 4.0 ile hayatımıza giren dynamic ve C# 1.0‘dan beri varolan object arasında ne fark var?

Önce eski dostumuz object ile başlayalım;

object anahtar kelimesi aslında System.Object sınıfının bir kısaltmasından başka birşey değildir (ki kendisi C# sınıf hiyerarşisinin en temelinde yer almaktadır)

Not : Birçoğumuzun bildiği gibi, aslında herşey object sınıfından türememektedir. bknz: Eric Lippert’in MSDN Blog yazısı

object tipinde bir değişkene, hemen hemen istediğimiz her değeri atayabiliriz. Birkaç örnek;

object Rakam = 10;
Console.WriteLine(Rakam.GetType());
/// System.Int32

Rakam = Rakam + 10;
/// Derleme zamanı hatası. Çünkü derleme anında Rakam değişkeni System.Object tipinde

Rakam = (int)Rakam + 10;
/// Hatasız atama için, unboxing yapmamız gerekiyor

Örnekte gördüğümüz gibi, Rakam değişkeninde rakamsal bir değer tutuyor olmamıza rağmen, derleyici, değişken üzerinde matematiksel işlem yapmamıza izin vermedi.

Değişken’in değerine erişebilmek için unboxing yapmak zorunda kaldık ve tip güvenliği olmadığı için çalışma zamanı hataları oluşturabilecek, zayıf bir kod ortaya çıktı.

Bir de C# 4.0 ile birlikte gelen dynamic inceleyelim;

dynamic Rakam = 10;
Console.WriteLine(Rakam.GetType());
/// object için aldığımız sonucun aynısını alıyoruz
/// System.Int32

Rakam = Rakam + 10;
/// Derleme zamanı hatası almayız, çünkü derleyici tipi çözümlemek için uğraşmaz.

Bu, object ile dynamic arasındaki en temel farktır. dynamic ile, derleyici‘ye (compiler), nesnenin tipinin sadece çalışma zamanında bilinebileceğini söylemiş oluyoruz.

Sonuçta aslında derleme zamanı için daha az kod yazıyoruz.

Fakat bu dynamic anahtar kelimesini daha az tehlikeli veya daha tehlikeli duruma getirmez.

Genelde bir sonraki soru; “dynamic ile herhangi bir method’a uygun olmayan tipte parametre gönderip, hata oluşmasını sağlayabilir miyim?” oluyor.

Basit bir örnek ile bu soruyu test edelim;

public static void AdSoyadYaz(string Ad, string Soyad)
{
    Console.WriteLine(Ad + " " + Soyad);
}

Bu method’umuzu dynamic tipindeki bir değişken ile çağıralım;

dynamic Ad = 10;
dynamic Soyad = 20;

/// Çalışma zamanı hatası almanız lazım.
AdSoyadYaz(Ad, Soyad);

Yukarıdaki kod ile, çalışma zamanında RuntimeBinderException tipinde bir hata almalısınız. Hatanın Message property’sinde; “The best overloaded method match for ‘AdSoyadYaz(string, string)’ has some invalid arguments” yazıyor olmalı.

dynamic Ad = "Engin";
dynamic Soyad = "Polat";

AdSoyadYaz(Ad, Soyad);

Gördüğünüz gibi, method’un çalıştırılması için parametre tipleri çalışma zamanında kontrol edilir, ve uygunsuz ise, RuntimeBinderException tipinde bir hata fırlatılır.

object anahtar kelimesinde ise, bu süreç derleme zamanında kontrol edilir.

object Ad = 10;
object Soyad = 20;

/// Derleme zamanı hatası almanız lazım.
AdSoyadYaz(Ad, Soyad);

object Ad = "Engin";
object Soyad = "Polat";

AdSoyadYaz((string)Ad, (string)Soyad);

C# Liste’nin eleman içerdiğini kontrol etmek

30 Kasım 2010 1 yorum

Aşağıdaki kod parçasına, programlama üzerine yazılmış bir makaleyi okurken rastladım;

public void IsNullOrEmpty<T>(IEnumerable<T> koleksiyon)
{
	if (koleksiyon == null || koleksiyon.Count() == 0)
	{
		/// Koleksiyon'da hiç eleman yok
		/// Koleksiyon boş
	}
}

Yukarıdaki method IEnumerable generic tipinde parametre alıyor, null veya boş olup/olmadığını kontrol ediyor.

Karşılaştırmada kullanılan,

Liste.Count() == 0

kod parçası dikkatimi çekti.

Eğer IsNullOrEmpty fonksiyonuna parametre olarak ICollection<T> interface‘ini implemente etmeyen tipten bir değer gönderecek olursak (mesela LINQ sorgusu sonucu olarak IQueryable) Count method’u tüm liste üzerinde satır-satır ilerleyerek listedeki eleman adedini hesaplayacaktır.

Eğer fonksiyona parametre olarak IEnumerable interface‘ini implemente eden tipten bir değer gönderecek olursak, Count method’u, optimize edilmiş haliyle, sadece koleksiyonun Count özelliğini sorgulayacaktır.

Türkçe ifadesiyle; “Koleksiyonda eleman var mı?” sorusu yerine “Koleksiyon’da sıfır eleman mı var?” sorusunu sormuş oluyoruz.

Aslında çözüm basit, System.Linq namespace‘inde yeralan Any extension method‘unu kullanmamız gerekiyor;

public void Test<T>(IEnumerable<T> koleksiyon)
{
	if (koleksiyon == null || !koleksiyon.Any())
	{
		/// Koleksiyon'da hiç eleman yok
		/// Koleksiyon boş
	}
}

Bu yöntemin güzelliği, IEnumerable interface‘inin MoveNext methodunu sadece bir kere çağırması. Koleksiyonda bulunan eleman adedi ne olursa olsun, Any methodu sonucu çok hızlı birşekilde döndürecektir.

Hatta kendi extension method‘umuzu da Any methodunu kullanarak yazabiliriz;

public static bool IsNullOrEmpty<T>(this IEnumerable<T> koleksiyon)
{
	return koleksiyon == null || !koleksiyon.Any();
}

Artık extension method‘u da yazdığımıza göre, asıl method‘u iyileştirebiliriz;

public void Test<T>(IEnumerable<T> koleksiyon)
{
	if (koleksiyon.IsNullOrEmpty())
	{
		/// Koleksiyon'da hiç eleman yok
		/// Koleksiyon boş
	}
}

C# Windows tarzı dosya boyutu formatlayıcı

04 Eylül 2010 Yorum yapılmamış

Eğer uygulamalarınızda dosya sistemindeki dosyalar veya dizinler ile uğraşıyorsanız (listeleme, filtreleme, vs.) büyük ihtimalle dosya veya dizinlerin boyutlarını hespalayan bir yönteminiz vardır.

Genellikle (kolay olduğundan ötürü) byte cinsinden dosya boyutunu 1000′e (bin) böler kilobyte cinsinden veya 1.000.000′a (milyon) böler megabyte cinsinden karşılığını buluruz.

Fakat Windows işletim sisteminde dosya veya dizinlerin boyutları en yakın birime göre hesaplanır ve gösterilir.

Küçük dosyalar byte, kilobyte veya megabyte cinsinden gösterilirken, daha büyük dosyalar gigabyte hatta terabyte cinsinden gösterilebiliyor.

Eğer biz de uygulamamızda dosya boyutlarını Windows tarzında göstermek istiyorsak, öncelikle birimleri elde etmemize yarayacak bir enum tanımlamalıyız;

public enum Boyutlar
{
	byte,
	kilobyte,
	megabyte,
	gigabyte,
	terabyte,
	petabyte
}

Daha sonra, parametre olarak noktalı rakam alan, geriye string döndüren bir method tanımlamalıyız;

public static string FormatDosyaBoyutu(decimal DosyaBoyutu)
{
}

FormatDosyaBoyutu method’unda, önce Boyutlar enum‘ından bir örnek oluşturacağız ve byte değerini içermesini sağlayacağız;

Boyutlar BoyutTanim = Boyutlar.byte;

Daha sonra bir döngü aracılığıyla, DosyaBoyutu değişkeni 1000′e bölünebildiği sürece BoyutTanim değişkeninin bir üst birimi içermesini sağlayacağız;

while (Math.Round(DosyaBoyutu) >= 1000)
{
	DosyaBoyutu /= 1024;
	BoyutTanim++;
}

Son olarak, method’dan geriye DosyaBoyutu değişkenin virgülden sonra 2 hane içeren ve doğru birimi gösteren değeri döndürmesini sağlayacağız;

return string.Format("{0}\t{1}", DosyaBoyutu.ToString("f2"), BoyutTanim);

Dosya Boyutu Formatlayıcı

Örnek kodun tamamı;

using System;
using System.Text;

namespace DosyaBoyutuFormatlayici
{
	class Program
	{
		public enum Boyutlar
		{
			byte,
			kilobyte,
			megabyte,
			gigabyte,
			terabyte,
			petabyte
		}

		public static void Main(string[] args)
		{
			Console.WriteLine(FormatDosyaBoyutu(0));
			Console.WriteLine(FormatDosyaBoyutu(10));
			Console.WriteLine(FormatDosyaBoyutu(200));
			Console.WriteLine(FormatDosyaBoyutu(3000));
			Console.WriteLine(FormatDosyaBoyutu(40000));
			Console.WriteLine(FormatDosyaBoyutu(500000));
			Console.WriteLine(FormatDosyaBoyutu(6000000));
			Console.WriteLine(FormatDosyaBoyutu(70000000));
			Console.WriteLine(FormatDosyaBoyutu(800000000));
			Console.WriteLine(FormatDosyaBoyutu(9000000000));
			Console.WriteLine(FormatDosyaBoyutu(10000000000));
			Console.WriteLine(FormatDosyaBoyutu(200000000000));
			Console.WriteLine(FormatDosyaBoyutu(3000000000000));
			Console.WriteLine(FormatDosyaBoyutu(40000000000000));
			Console.WriteLine(FormatDosyaBoyutu(500000000000000));
			Console.WriteLine(FormatDosyaBoyutu(6000000000000000));
			Console.WriteLine(FormatDosyaBoyutu(70000000000000000));
			Console.WriteLine(FormatDosyaBoyutu(800000000000000000));
			Console.WriteLine(FormatDosyaBoyutu(9000000000000000000));
			Console.WriteLine(FormatDosyaBoyutu(10000000000000000000));

			Console.ReadLine();
		}

		public static string FormatDosyaBoyutu(decimal DosyaBoyutu)
		{
			Boyutlar BoyutTanim = Boyutlar.byte;

			while (Math.Round(DosyaBoyutu) >= 1000)
			{
				DosyaBoyutu /= 1024;
				BoyutTanim++;
			}

			return string.Format("{0}\t{1}", DosyaBoyutu.ToString("f2"), BoyutTanim);
		}
	}
}

C# string sınıfı ve özellikleri

03 Eylül 2010 1 yorum

.Net string sınıfı uygulamalarımızda sıklıkla kullandığımız sınıflardan biridir.

.Net 1.1 versiyonundan itibaren gelişme göstermesine rağmen, hala bazı fonksiyonlarının eksik olduğunu veya tam anlamıyla kullanılmadığını düşünüyoum.

Bu makalemde, string sınıfının çok bilinmeyen veya çok kullanılmayan özelliklerine ve methodlarına değinmeye çalışacağım.

String değişkeni tekrar eden karakterler ile doldurmak

String değişkeni tekrar eden karakterler ile doldurmak için, String sınıfının constructor’ını kullanmak gerekir.

Örneğin, bir string değişkeni 50 adet nokta (.) karakteri ile doldurmak istiyorsak;

string degisken = new string('.', 50);

String değişkenin boş olduğunu kontrol etmek

String değişkenin değer içerip içermediğini belirlemek için string.Empty ve boş tırnaklar (“”) ile karşılaştırmamız gerekir.

if (degisken != null && degisken != "")
{
}

Alternatif olarak bu iki karşılaştırmayı yapmak yerine, .Net 2.0 ile gelen string.IsNullOrEmpty static fonksiyonunu kullanabiliriz;

if (!string.IsNullOrEmpty(degisken))
{
}

String.Empty ve boş tırnaklar (“”) arasındaki fark

İnternette çeşitli sitelerde, string.Empty ve boş tırnaklar (“”) arasında seçim yapmak için yazılmış makalelere rastlayabilirsiniz.

Aslında yapılan onlarca test gösteriyor ki, performans açısından bakıldığında string.Empty ve boş tırnaklar (“”) arasında önemsenmeyecek kadar küçük bir fark vardır.

Yapılan testler milyarlarca string değişken üzerinde yapılmasına rağmen ortaya çıkan fark göz ardı edilebilecek kadar düşük seviyededir.

String değişkenin içeriğini ters çevirmek

Bir string değişkenin içeriğini ters çevirmek için çeşitli algoritmalara internet üzerinden ulaşabilir veya kendi algoritmanızı geliştirebilirsiniz.

Kodun temizliği, hız, Unicode karakter setleri ile sorunsuz çalışabilmesi açısından benim en çok kullandığım yöntem şudur;

public static string Reverse(this string s)
{
	char[] charArray = s.ToCharArray();
	Array.Reverse(charArray);
	return new string(charArray);
}

String karşılaştırma

String değişkenin değeri null olabileceği için, karşılaştırma operatörünü (==) kullanmaktan kaçınmamız gerekir.

Bunun yerine String sınıfının static Compare method’unu kullanmamız daha doğrudur.

Static Compare method’u sayesinde null referans’ları doğru şekilde karşılaştırabilir, büyük-küçük harf duyarlılığını yoksayabilir, farklı Culture’daki değerleri karşılaştırabiliriz.

if (String.Compare(degisken1, degisken2, true) == 0)
{
}

Büyük-Küçük harf duyarlılığı olmayan IndexOf

String sınıfının IndexOf method’u büyük-küçük harf duyarlıdır. Büyük-Küçük harf duyarlılığı olmadan IndexOf method’unu kullanmak istiyorsak, System.Globalization namespace’inde yeralan CompareInfo sınıfı’nın IndexOf method’unu kullanabiliriz;

using System.Globalization;

string degisken1 = "Uygulamalarımızın olmazsa olmaz unsurları değişkenlerdir";
string degisken2 = "OLMAZ";

CompareInfo karsilastirma = CultureInfo.InvariantCulture.CompareInfo;
int i = karsilastirma.IndexOf(degisken1, degisken2, CompareOptions.IgnoreCase);

string ve String farkı

MSDN’deki String sınıfı ile alakalı bir sayfadan alıntı;

“The keyword string is simply an alias for the predefined class System.String.” – C# Language Specification 4.2.3

Türkçesi;

“string anahtar kelimesi basitçe, System.String sınıfının takma adıdır.” – C# Language Specification 4.2.3