Arşiv

Etiketlenen yazılar csharp

Yeni Seri – Euler

19 Ağustos 2010 Yorum yapılmamış

cebirci arkadaşım sayesinde yeni bir seri yazmaya başlıyorum; Euler.

www.projecteuler.net adresinde sorularına ulaşabileceğiniz Project Euler, matematiğine güvenen programcılara hitap ediyor.

Project Euler, basit olarak sizi, şu ana kadar tanımlanmış ve kolaydan zora göre numaralandırılmış 299 matematik sorusunu çözmeye davet ediyor.

Fakat, soruları istediğiniz programlama dili ile yazacağınız uygulamalara çözdürmeniz lazım.

Ben soruları C# programlama dilini kullanarak çözmeye çalışacağım.

C# Veri Tipleri

27 Temmuz 2010 1 yorum

Uygulamalarımızın olmazsa olmaz unsurları herhalde değişkenlerdir. Orta ölçekli bir uygulamada, kabaca bir tahminle yüzlerce değişken tanımlıyoruzdur.

Kullanım yoğunluğuna bakarak, oluşturduğumuz değişkenlerin tiplerinin doğru belirlenmesinin ne kadar önemli olduğunu anlayabiliriz.

C# ile kullanabileceğimiz değişkenlerin en önemlilerini aşağıda listeledim;

Veri Tipi Kapladığı Alan Değer Aralığı
Tam Sayı Veri Tipleri
sbyte 1 byte -128 ve +127
byte 1 byte 0 ve +255
short 2 byte -32768 ve +32767
ushort 2 byte 0 ve 65535
int 4 byte -2.147.483.648 ve +2.147.483.647
uint 4 byte 0 ve 4.294.967.295
long 8 byte -9.223.372.036.854.775.808 ve +9.223.372.036.854.775.807
ulong 8 byte 0 ve 18,446,744,073,709,551,615
Noktalı Sayı Veri Tipleri
single 4 byte -3.402823E38 ve +3.402823E38
double 8 byte -1.79769313486232E308 ve +1.79769313486232E308
decimal 16 byte -7.9E1028 ve +7.9E1028
Diğer Veri Tipleri
char 2 byte Tek Karakter
string ~ (2 byte x harf adedi) Karakter Dizisi
bool 4 byte True veya False
DateTime 8 byte 1/1/0001 12:00:00 ve 31/12/9999 23:59:59

C# siz olsanız hangisini yazardınız?

27 Temmuz 2010 3 yorum

İnternette gezerken şöyle bir kod parçasına rastladım;

public void ShowPanelWindow(bool isVisible)
{
	Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed;
}

public void ShowBusy(bool isBusy)
{
	BusyIndicator.ShowIsBusy = isBusy;
}

Bu kodu yazan kişi, eğer yukarıdaki kodu şimdi yazsaydım şöyle yazardım demiş ve aşağıdaki kod parçasını yazmış;

public void HidePanelWindow()
{
	Visibility = Visibility.Collapsed;
}

public void ShowPanelWindow()
{
	Visibility = Visibility.Visible;
}

public void LookBusy()
{
	BusyIndicator.ShowIsBusy = true;
}

public void StopLookingBusy()
{
	BusyIndicator.ShowIsBusy = false;
}

Bu iki kodu okuduktan sonra, kendi kendime sordum ve ben de ikinci tarz yaklaşımı kullanırdım.

Peki siz olsanız hangi tarz kodu tercih ederdiniz?

Kısa kod mu? Kendini anlatan kod mu?

C# ile Form’a gölge efekti verelim ve titreme sorununu düzeltelim

Windows Forms uygulamalarında Form‘un gölge efektine sahip olmasını istiyorsak, öncelikle Form‘un FormBorderStyle özelliğini None yapmalıyız.

this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;

Form sınıfının CreateParams özelliğini override etmemiz gerekiyor. CreateParams özelliği geriye CreateParams tipinde bir nesne döndürür.

protected override CreateParams CreateParams
{
	get
	{
		CreateParams cp = base.CreateParams;

		cp.ClassStyle |= 0x20000;

		return cp;
	}
}

CreateParams sınıfının ClassStyle özelliğine 0×20000 değerini ekliyoruz. Böylece formumuz çalışmaya başladığında etrafında gölge gözüküyor.

Gölgeli Form

Form üzerine çok fazla kontrol eklediğimizde, özellikle eğer kontroller hafızada çok yer kaplayan 3.parti kontrollerden ise; formumuzda titreme diyebileceğimiz bir efekt oluşmaya başlar.

Çoğu zaman bu durum rahatsızlık oluşturma derecesine kadar varır.

Bu sorunu çözmek için, kontrollerin DoubleBuffered özelliğini true değerine ayarlamamız gerekmektedir.

Fakat DoubleBuffered özelliği Form sınıfının değil Control sınıfının bir özelliği olduğundan dolayı, Form’un titremesini gidermek için kullanamayız.

Form sınıfının CreateParams özelliğinde bu sorunu da çözebiliriz;

protected override CreateParams CreateParams
{
	get
	{
		CreateParams cp = base.CreateParams;

		cp.ExStyle |= 0x02000000;

		return cp;
	}
}

Bu sefer CreateParams sınıfının ExStyle özelliğine 0×02000000 değerini eklememiz gerekiyor.

Örnek uygulamanın tüm kodu;

protected override CreateParams CreateParams
{
	get
	{
		CreateParams cp = base.CreateParams;

		cp.ClassStyle |= 0x20000;

		cp.ExStyle |= 0x02000000;

		return cp;
	}
}

Dizide bir elemandan kaç adet olduğunu bulalım

Elimizdeki bir dizide, belli bir elemandan kaç adet olduğunu bulmamız gerekebilir.

Bunu yapmanın programatik olarak en kolay yolu LINQ sorgusu yazmaktır.

Örneğin aşağıdaki Extension Method, LINQ sorgusu ile aranan elemandan, ilgili listede kaç adet olduğu sonucunu döndürür;

public static int CountTimes< T >(this List< T > list, T item)
{
	return ((from t in list where t.Equals(item) select t).Count());
}

Örnek kullanım;

using System;
using System.Linq;
using System.Collections.Generic;

public static class Program
{
	static void Main(string[] args)
	{
		var list1 = new List< int >() { 1, 2, 3, 4, 5, 6, 7, 7, 8, 9 };
		var list2 = new List< string >() { "a", "b", "b", "b", "c", "d", "e", "f" };

		Console.WriteLine("Birinci listede 7, " + list1.CountTimes(7) + " adet var");
		Console.WriteLine("İkinci  listede b, " + list2.CountTimes("b") + " adet var");

		Console.ReadLine();
	}

	public static int CountTimes< T >(this List< T > list, T item)
	{
		return ((from t in list where t.Equals(item) select t).Count());
	}
}

Yukarıdaki örnek kodu çalıştırdığınızda, şöyle bir sonuç almanız lazım;

Birinci listede 7, 2 adet var
İkinci  listede b, 3 adet var

C# ile Network Activity Monitor yazalım

09 Temmuz 2010 2 yorum

Bilgisayarın network aktivitesini ölçmemiz gerektiğinde, bu görevi gerçekleştirecek bir yazılım geliştirebiliriz.

Yapmamız gereken Windows’un Performance Counter listesinden doğru sayaçları okumak. Bu yazımda böyle bir uygulama geliştireceğim.

Öncelikle bilgisayarda bulunan ağ arayüzlerinin listesini alalım;

string[] NetworkAdapter = new PerformanceCounterCategory("Network Interface").GetInstanceNames(); /// ağ arayüzlerinin listesi

Şimdi System.Diagnostics namespace’inde yeralan PerformanceCounter sınıfından yeni bir örnek çıkartıp, doğru sayaçlardan bilgi okuyabiliriz.

Bilgisayarın ağ üzerinden yaptığı download ve upload miktarını ölçmek için, Network Interface isimli Performance Counter‘ın Bytes Received ve Bytes Sent isimli sayaçlarını kullanacağız.

PerformanceCounter Download = new PerformanceCounter("Network Interface", "Bytes Received/sec", NetworkAdapter[1]);
PerformanceCounter Upload = new PerformanceCounter("Network Interface", "Bytes Sent/sec", NetworkAdapter[1]);

NetworkChange sınıfının static üyelerinden NetworkAvailabilityChanged event‘ine bir delegate method atayarak, bilgisayarın ağ bağlantı durumunda değişiklik olunca farketmesini sağlayabiliriz.

Yazdığımız uygulamada her 10 saniye’de bir bilgisayarın download ve upload miktarını ekrana yazacak olalım;

Timer t = new Timer(10000); /// 10 saniye

NetworkChange.NetworkAvailabilityChanged += delegate(object _sender, NetworkAvailabilityEventArgs _e) { /// network durumu değiştiğinde
	if (_e.IsAvailable) /// eğer network ulaşılabilir duruma geldi ise
	{
		t.Start(); ///başla
	}
	else
	{
		t.Stop(); /// dur
	}
};

Timer nesnesinin Elapsed event‘inde de ekrana download ve upload miktarı bilgilerini yazacağız;

t.Elapsed += delegate(object _sender, ElapsedEventArgs _e) {
	Console.WriteLine("Download : {0} kb.\t\tUpload : {1} kb.", Download.NextValue(), Upload.NextValue()); /// ekrana download & upload miktarını yaz
};

Örnek uygulamanın tüm kodu;

using System;
using System.Net.NetworkInformation;
using System.Timers;
using System.Diagnostics;

class Program
{
	static void Main(string[] args)
	{
		string[] NetworkAdapter = new PerformanceCounterCategory("Network Interface").GetInstanceNames(); /// network kartlarının listesi

		PerformanceCounter Download = new PerformanceCounter("Network Interface", "Bytes Received/sec", NetworkAdapter[1]);
		PerformanceCounter Upload = new PerformanceCounter("Network Interface", "Bytes Sent/sec", NetworkAdapter[1]);

		Timer t = new Timer(10000); /// 10 saniye
		t.Elapsed += delegate(object _sender, ElapsedEventArgs _e) {
			Console.WriteLine("Download : {0} kb.\t\tUpload : {1} kb.", Download.NextValue(), Upload.NextValue()); /// ekrana download & upload miktarını yaz
		};

		NetworkChange.NetworkAvailabilityChanged += delegate(object _sender, NetworkAvailabilityEventArgs _e) { /// network durumu değiştiğinde
			if (_e.IsAvailable) /// eğer network ulaşılabilir duruma geldi ise
			{
				t.Start(); ///başla
			}
			else
			{
				t.Stop(); /// dur
			}
		};

		t.Start();

		Console.ReadLine();
	}
}

Ayın ilk ve son gününü bulmak için Extension Method

Özellikle raporlama uygulamalarında, aylık dönemlere ait sorgulama yapılırken ilgili ayın ilk ve son günlerinin bilinmesi gerekir.

C# uygulamamızda, yazacağımız basit iki tane extension method ile ayın ilk ve son günlerini bulan kodu basitleştirebiliriz.

public static class ExtensionMethods
{
	public static DateTime AyinIlkGunu(this DateTime dt)
	{
		return new DateTime(dt.Year, dt.Month, 1);
	}

	public static DateTime AyinSonGunu(this DateTime dt)
	{
		return dt.AyinIlkGunu().AddMonths(1).AddDays(-1);
	}
}

Extension Method‘ların kullanımı;

static void Main(string[] args)
{
	DateTime BuAy_BaslangicTarihi = DateTime.Now.AyinIlkGunu();
	DateTime BuAy_BitisTarihi = DateTime.Now.AyinSonGunu();

	DateTime GecenAy_BaslangicTarihi = DateTime.Now.AddMonths(-1).AyinIlkGunu();
	DateTime GecenAy_BitisTarihi = DateTime.Now.AddMonths(-1).AyinSonGunu();
}

Örnek kodun tamamı;

using System;

class Program
{
	static void Main(string[] args)
	{
		DateTime BuAy_BaslangicTarihi = DateTime.Now.AyinIlkGunu();
		DateTime BuAy_BitisTarihi = DateTime.Now.AyinSonGunu();

		DateTime GecenAy_BaslangicTarihi = DateTime.Now.AddMonths(-1).AyinIlkGunu();
		DateTime GecenAy_BitisTarihi = DateTime.Now.AddMonths(-1).AyinSonGunu();
  }
}

public static class ExtensionMethods
{
	public static DateTime AyinIlkGunu(this DateTime dt)
	{
		return new DateTime(dt.Year, dt.Month, 1);
	}

	public static DateTime AyinSonGunu(this DateTime dt)
	{
		return dt.AyinIlkGunu().AddMonths(1).AddDays(-1);
	}
}

C# ile GMail üzerinden e-posta gönderme

07 Temmuz 2010 4 yorum

Windows uygulamalarınız üzerinden e-posta gönderebilmek güzel bir özellik.

Uygulama içerisinden e-posta gönderme konusunda ilk akla gelen sorulardan bir tanesi, “GMail üzerinden e-posta gönderebilir miyim?” oluyor.

Bu yazımda, GMail üzerinden e-posta gönderebileceğimiz bir uygulama geliştireceğim.

Öncelikle kodumuzun using kısmına System.Net ve System.Net.Mail namespace’ini eklememiz gerekiyor.

.Net Framework, System.Net.Mail namespace‘i içerisinde çeşitli class‘lar aracılığı ile uygulamanız içerisinden kolaylıkla e-posta gönderilmesini mümkün kılıyor.

using System.Net.Mail;
using System.Net;

İlk yapmamız gereken, SmtpClient sınıfından bir örnek oluşturmak ve bazı özelliklerini ayarlamak.

SmtpClient sc = new SmtpClient();
sc.Port = 587;
sc.Host = "smtp.gmail.com";
sc.EnableSsl = true;

Port özelliği ile, Smtp sunucusuna erişeceğimiz port numarasını belirliyoruz

Host özelliği ile, GMail Smtp sunucusunun adresini belirliyoruz

EnableSsl özelliği ile, GMail Smtp sunucusuna bağlanacağımız protokolu belirliyoruz. Eğer true değer atarsak https, eğer false değer atarsak http protokolü kullanılır.

GMail e-posta adresimizi ve şifremizi, Credentials özelliğine NetworkCredential sınıfından bir örnek ile atamamız gerekiyor.

sc.Credentials = new NetworkCredential("eposta@gmail.com", "gmail_sifre");

SmtpClient örneği üzerinden gönderilecek posta, MailMessage tipinde olmalıdır. Bir sonraki adımda MailMessage sınıfından bir örnek oluşturuyoruz.

MailMessage mail = new MailMessage();

mail.From = new MailAddress("eposta@gmail.com", "Ekranda Görünecek İsim");

mail.To.Add("alici1@mail.com");
mail.To.Add("alici2@mail.com");

mail.CC.Add("alici3@mail.com");
mail.CC.Add("alici4@mail.com");

mail.Subject = "E-Posta Konusu";
mail.IsBodyHtml = true;
mail.Body = "E-Posta İçeriği";

mail.Attachments.Add(new Attachment(@"C:\Rapor.xlsx"));
mail.Attachments.Add(new Attachment(@"C:\Sonuc.pptx"));

Son olarak, SmtpClient sınıfının Send() method’unu kullanarak, oluşturduğumuz MailMessage örneğini gönderiyoruz.

sc.Send(mail);

Kodların toparlanmış hali;

using System;
using System.Net.Mail;
using System.Net;

class Program
{
	static void Main(string[] args)
	{
		SmtpClient sc = new SmtpClient();
		sc.Port = 587;
		sc.Host = "smtp.gmail.com";
		sc.EnableSsl = true;

		sc.Credentials = new NetworkCredential("eposta@gmail.com", "gmail_sifre");

		MailMessage mail = new MailMessage();

		mail.From = new MailAddress("eposta@gmail.com", "Ekranda Görünecek İsim");

		mail.To.Add("alici1@mail.com");
		mail.To.Add("alici2@mail.com");

		mail.CC.Add("alici3@mail.com");
		mail.CC.Add("alici4@mail.com");

		mail.Subject = "E-Posta Konusu"; mail.IsBodyHtml = true; mail.Body = "E-Posta İçeriği";

		mail.Attachments.Add(new Attachment(@"C:\Rapor.xlsx"));
		mail.Attachments.Add(new Attachment(@"C:\Sonuc.pptx"));

		sc.Send(mail);
	}
}

C# ile Hash işlemi

06 Temmuz 2010 2 yorum

Sql Server ile nasıl hash yapabileceğimizi daha önce Sql Server’da Hash işlemi isimli makalemde yazmıştım. Bu sefer, .net üzerinde C# ile nasıl hash işlemi yapabileceğimizi yazacağım.

Hash, büyük boyutta girdi verisi için sabit boyutlu üretilen benzersiz değerdir. Hash algoritmalarının yapısından dolayı, girdi verisindeki küçük değişiklikler sonuç verisinde büyük farklılıklara yol açmaktadır.

.Net Framework üzerinde bulunan System.Security.Cryptography namespace’i, güvenli şifreleme ve çözme işlemleri için şifreleme servislerini barındırır.

.Net Framework şu hash algoritmalarını destekler;

MD5, girdi verisini şifrelemek için 128 bit şifreleyici kullanır
SHA1, girdi verisini şifrelemek için 160 bit şifreleyici kullanır
SHA256, girdi verisini şifrelemek için 256 bit şifreleyici kullanır
SHA384, girdi verisini şifrelemek için 384 bit şifreleyici kullanır
SHA512, girdi verisini şifrelemek için 512 bit şifreleyici kullanır

En çok kullanılan şifreleme yöntemlerinden biri SHA1‘dir.

SHA1 Hashing Algoritması Örneği

Öncelikle kod yazdığımız dosyanın using kısmına System.Secuity.Cryptography namespace’ini eklemeliyiz;

using System.Secuity.Cryptography;

SHA1 sınıfından bir örnek oluşturalım;

SHA1 sha = new SHA1CryptoServiceProvider();

SHA1 sınıfı abstract bir sınıf olduğu için kendisinden örnek oluşturamıyoruz. SHA1 sınıfından türetilen SHA1CryptoServiceProvider sınıfından bir örnek oluşturuyoruz.

Artık yapmamız gereken, sha isimli değişkenimizin ComputeHash() method’unu çağırmak. ComputeHash() method’u, şifrelenecek veriyi parametre olarak byte dizisi aldığı ve geriye şifrelenmiş veriyi byte dizisi olarak döndürdüğü için aşağıdaki örnekte olduğu gibi kullanabiliriz;

string SifrelenecekVeri = "http://www.enginpolat.com/";

string SifrelenmisVeri = Convert.ToBase64String(sha.ComputeHash(Encoding.UTF8.GetBytes(SifrelenecekVeri)));

Uygulamanın kodlarının toparlanmış hali;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

class Program
{
  static void Main(string[] args)
  {
    SHA1 sha = new SHA1CryptoServiceProvider();

    string SifrelenecekVeri = "http://www.enginpolat.com/";

    string SifrelenmisVeri = Convert.ToBase64String(sha.ComputeHash(Encoding.UTF8.GetBytes(SifrelenecekVeri)));

    Console.WriteLine(SifrelenmisVeri);

    Console.ReadLine();
  }
}

Yukarıdaki örneği çalıştırırsanız şifrelenmiş çıktı şöyle olacaktır;

8hocM3G7QhUoN7Nm3bWMSr0/SsM=

Not Responding durumundaki Process’leri bulmak

05 Temmuz 2010 1 yorum

O anda çalışmakta olan uygulamaların durumlarını gözleyen bir service yazmamız gerektiğinde, gözlediğimiz uygulamanın kullanıcıya yanıt verip-vermediğini bulabilmemiz gerekir.

Bunu .Net Framework‘teki Process sınıfının üyeleri ile kolaylıkla yapabiliriz.

Process Sınıfı

Process sınıfı System.Diagnostics namespace‘i içerisinde yeralır. Process sınıfı birçok static ve instance üyeye sahiptir. Bu üyeler sayesinde, lokal bilgisayardaki veya uzak bilgisayardaki herhangi bir uygulamaya müdahele edebilirsiniz. Ayrıca Process sınıfı ilgili uygulamanın “çalıştığını” veya “yanıt vermiyor” durumuna düştüğünü de belirleyebilir.

Bu özellik, uygulamaları monitör eden bir service geliştirecekseniz çok kullanışlıdır.

Bu yazıda, basit bir console uygulaması ile bilgisayardaki “yanıt veren” ve “yanıt vermeyen” uygulamaları listeleyeceğiz.

Öncelikle System.Diagnostics namespace‘ini kod’umuzun using kısmına ekleyelim;

using System.Diagnostics;

Bilgisayarda o anda çalışan uygulamaları Process sınıfının GetProcesses() method’undan Process dizisi olarak alabiliriz;

Process[] p = Process.GetProcesses();

Basit bir döngü ile o anda çalışmakta olan process‘ler arasında dönebiliriz. Sonra tek yapmamız gereken, Process sınıfının statik Responding property’sine bakmak;

if (p.Responding)
	Console.WriteLine(" yanıt veriyor.");
else
	Console.WriteLine(" yanıt VERMİYOR!");

Uygulamanın kodlarını toparlarsak;

Process[] processes = Process.GetProcesses();
foreach (Process p in processes)
{
	Console.Write(p.ProcessName);

	if (p.Responding)
		Console.WriteLine(" yanıt veriyor.");
	else
		Console.WriteLine(" yanıt VERMİYOR!");
}

Haziran 2010 Etkinliklerim

Mayıs ayında olduğu gibi, Haziran ayında da pek boş durmadım.

Bahçeşehir Üniversitesinin son haftasonu XNA – Oyun Programlama seminerini verdim.

Ayrıca BilgeAdam Beşiktaş şubesinde ASP.NET 4.0 ve C# 4.0 üzerine iki tane seminerim oldu.

Uygulamadan aynı anda bir tane açılmasını garantilemek

Yazdığımız uygulamalardan aynı anda sadece bir tane açık olmasını isteyebiliriz. Bunu garantilemek için, yapmamız gereken process’ler arası iletişim kanalı oluşturmak ve kullanmak olmalıdır.

C# dilinde process’ler arası iletişim (cross-process communication) Mutex sınıfı ile sağlanır.

Mutex sınıfının kullanımını hemen bir örnek ile inceleyelim;

[STAThread]
static void Main()
{
	bool AcikUygulamaVar = false;
	Mutex m = new Mutex(true, "UygulamanınAdı", out AcikUygulamaVar);
	if (AcikUygulamaVar)
	{
		Application.EnableVisualStyles();
		Application.SetCompatibleTextRenderingDefault(false);
		Application.Run(new MainForm());
	}
	else
	{
		MessageBox.Show("Uygulamadan aynı anda bir tane açabilirsiniz!");
	}
}

Mutex sınıfı ile ilgili daha detaylı bilgiye MSDN‘deki şu makaleden ulaşabilirsiniz.

.Net 4 COM İyileştirmeleri – Office Uygulamarı ile Çalışmak

03 Mart 2010 1 yorum

.Net 4.0 COM İyileştirmeleri başlığı altında birçok yeni yeteneğe sahiptir. Şubat ayında verdiğim seminerlerden C# 4.0 Yenilikleri – 2 seminerinde COM İyileştirmeleri başlığında özellikle bu yeniliklerden bahsettim.

BilgeAdam‘daki bir öğrencimin sorusu üzerine bu yazımda Excel ve Word kullanımına ilişkin bir örnek yapacağım.

Öncelikle yeni bir Console Application projesi oluşturalım ve referanslara

  • Microsoft.Office.Interop.Excel
  • Microsoft.Office.Interop.Word

referanslarını ekleyelim.

Bu örnekte yapmak istediğimiz;

  • Bilgisayarımızda o anda en çok hafıza alanı kullanan 10 uygulamanın adını ve kulandığı hafıza miktarını yeni bir Excel dosyasında iki sütuna alt alta yazmak
  • Aynı excel dosyasının ikinci bir sheet’ine bu tablodan bir chart üretmek
  • Bu chart’ı kopyalayıp, yeni açacağımız bir Word dosyasına yapıştırmak

Hazırsanız, Program.cs dosyamıza aşağıdaki kodları yazmakla başlayalım;

using direktiflerini yazdığımz yere

using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;
using System.Diagnostics;

satırlarını ekleyelim

Yeni bir Excel dosyası oluşturmak ve görünür kılmak için;

var excel = new Excel.Application();
excel.Visible = true;

Bu Excel dosyasına yeni bir sheet eklemek ve tablonun başlıklarını yazmak için;

excel.Workbooks.Add();
excel.Cells[1, 1].Value = "Uygulama Adı";
excel.Cells[1, 2].Value = "Hafıza Kullanımı";

Tabloya en çok hafıza kullanan uygulamaları eklemek için;

int i = 2;
foreach (var p in Process.GetProcesses().OrderByDescending(p => p.WorkingSet64).Take(10))
{
	excel.Cells[i, 1].Value = p.ProcessName;
	excel.Cells[i, 2].Value = p.WorkingSet64;
	i++;
}

Tabloyu Excel dosyasında yeni bir sheet içerisine chart olarak eklemek için;

Excel.Range range = excel.Cells[1, 1];
Excel.Chart chart = excel.ActiveWorkbook.Charts.Add(After: excel.ActiveSheet);
chart.ChartWizard(Source: range.CurrentRegion, Title: Environment.MachineName + " Toplam Hafıza Kullanımı");
chart.ChartStyle = 45;

Tabloyu panoya kopyalamak, yeni bir Word dosyası açıp, içine yapıştırmak için;

chart.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlBitmap, Excel.XlPictureAppearance.xlScreen);

var word = new Word.Application();
word.Visible = true;
word.Documents.Add();
word.Selection.Paste();

Tüm kodları tekrar yazarsak;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;
using System.Diagnostics;

namespace COMIyilestirmeleri_OfficeUygulamasi
{
	class Program
	{
		static void Main(string[] args)
		{
			var excel = new Excel.Application();
			excel.Visible = true;
			excel.Workbooks.Add();
			excel.Cells[1, 1].Value = "Uygulama Adı";
			excel.Cells[1, 2].Value = "Hafıza Kullanımı";
			int i = 2;
			foreach (var p in Process.GetProcesses().OrderByDescending(p => p.WorkingSet64).Take(10))
			{
				excel.Cells[i, 1].Value = p.ProcessName;
				excel.Cells[i, 2].Value = p.WorkingSet64;
				i++;
			}
			Excel.Range range = excel.Cells[1, 1];
			Excel.Chart chart = excel.ActiveWorkbook.Charts.Add(After: excel.ActiveSheet);
			chart.ChartWizard(Source: range.CurrentRegion, Title: Environment.MachineName + " Toplam Hafıza Kullanımı");
			chart.ChartStyle = 45;
			chart.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlBitmap, Excel.XlPictureAppearance.xlScreen);

			var word = new Word.Application();
			word.Visible = true;
			word.Documents.Add();
			word.Selection.Paste();
		}
	}
}

Belirlediğiniz şablonda rastgele string üretmek

Uygulamanızda sizin belirlediğiniz şablona göre rastgele üretilmiş bir string’e ihtiyaç duyarsanız, aşağıdaki kod işinizi görebilir;

Random r = new Random();
string KullanilabilecekKarakterler = "AzByCxDwEvFuGtHsIrJqKpLoMnNmOlPkQjRiShTgUfVeWdXcYbZa1234567890";

MatchEvaluator Rastgele = delegate (Match m) {
	return KullanilabilecekKarakterler[r.Next(KullanilabilecekKarakterler.Length)].ToString();
};

Console.WriteLine(Regex.Replace("XXXX-XXXX-XXXX-XXXX", "X", Rastgele)); /// Lv2U-jHsa-TUep-NqKa
Console.WriteLine(Regex.Replace("Şifreniz : XXXX", "X", Rastgele)); /// Şifreniz : w6G0
Console.WriteLine(Regex.Replace("XXX.XXX-XX/XX", "X", Rastgele)); /// Fu8.c3Y-xT/6P
Console.WriteLine(Regex.Replace("XXXXXX", "X", Rastgele)); /// 8cPD2y

virtual olmayan method’ları override etmek

Base class‘ta tanımlanmış bir method‘u override etmemiz gerekiyor. Fakat method virtual yazılmamışsa, override edilemez. Türetilmiş class‘ta base class‘taki virtual olmayan method’u nasıl override edebiliriz?

Türetilmiş class’ta base class’taki method’u override etmek yerine new anahtar kelimesi ile baştan yazabiliriz. Böylece virtual yazılmamış ve dolayısıyla override edilemeyecek method’ları “bir çeşitoverride etmiş oluruz.

class Base
{
	public virtual void VirtualGoster()
	{
		Console.WriteLine(“Base.VirtualGoster”);
	}

	public void Goster()
	{
		Console.WriteLine(“Base.Goster”);
	}
}

class Derived : Base
{
	public override void VirtualGoster()
	{
		Console.WriteLine(“Derived.VirtualGoster”);
	}

	public new void Goster()
	{
		Console.WriteLine(“Derived.Goster”);
	}
}

class Program
{
	static void Main(string[] args)
	{
		Base base = new Derived();
		base.VirtualGoster();
		base.Goster();

		Console.WriteLine();

		Derived derived = new Derived();
		derived.VirtualGoster();
		derived.Goster();
	}
}

Çıktı :
Derived.VirtualGoster
Base.Goster
Derived.VirtualGoster
Derived.Goster

C# const ve readonly farkı

Senaryo : Uygulama çalışırken değeri değiştirilemeyecek değişken tanımlamanız gerekiyor.

Çözüm : Muhtemel iki çözüm var, const ve readonly değişken tanımlamak. Fakat aralarında önemli bir fark var;

const : Türkçe’ye Sabit olarak çevrilebilir. Class seviyesinde tanımlanır ve tanımlanma anında değeri verilmek zorundadır. Sonradan değeri değiştirilemez.

readonly : Sadece-Okunabilir anlamına gelir. Class seviyesinde tanımlanır. Tanımlandığı anda değeri verilebilir veya Class Constructor’ında değeri verilebilir. Sonradan değeri değiştirilemez.

public class Matematik
{
	private const double PI = 3.14159;
}
public class Matematik
{
	private readonly int PI; /// PI değişkeninin değerini burada da verebilirdim.

	public Matematik()
	{
		PI = 22 / 7;
	}
}

C# Klasörün Sadece-Okunabilir Olduğunu Döndüren Extension Method

Deneysel amaçlı yazdığım extension method’lardan biridir;

namespace Extensions
{
	public static class ExtensionManager
	{
		public static bool SadeceOkunabilir(this DirectoryInfo Dizin)
		{
			if (Dizin == null)
				throw new ArgumentNullException("Dizin parametresi boş olamaz");

			return (Dizin.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly;
		}
	}
}

C# iki koddan hangisini tercih edersiniz?

19 Şubat 2010 3 yorum

Aşağıdaki kodlardan hangisini yazmayı tercih edersiniz?

bool loginSuccessful;

if (NetworkAvailable())
	loginSuccessful= LogUserOn();
else
	loginSuccessful= false;

veya

bool loginSuccessful= NetworkAvailable() && LogUserOn();

İki yazım şekli de aynı sonucu üretir. Siz olsanız hangisini tercih ederdiniz?

C# String Dizisini String Uzunluğuna Göre Sıralama

C# ile string dizisini elemanların uzunluğuna göre sıralama için aşağıdaki kod kullanılabilir;

private IList<string> SortStringLength(IList<string> arrString)
{
	string[] tmpString = arrString.ToArray<string>();
	Array.Sort(tmpString, new Comparison<string>(delegate(string str1, string str2)
	{
		if (str1 == null && str2 == null)
			return 0; ///iki değişkende null
		else if (str1 == null)
			return -1; ///birinci değişken null
		else if (str2 == null)
			return 1; ///ikinci değişken null
		else
		{
			if (str1.Length < str2.Length)
				return -1; ///birinci değişken daha kısa
			else if (str1.Length > str2.Length)
				return 1; ///ikinci değişken daha kısa
			else
				return str1.CompareTo(str2); ///iki değişken aynı uzunlukta, alfabetik sıralama yapılıyor
		}
	}));

	return tmpString;
}
string[] OrnekDizi = { "333", null, "1", "22", "12", "4444" };
OrnekDizi = (string[])SortStringLength(OrnekDizi);

foreach (string s in OrnekDizi)
    Console.WriteLine(s);

// Console Çıktısı:
// [null]
// 1
// 12
// 22
// 333
// 4444

Bu kodu kullanarak sıraladığınız string dizisinde, elemanlar önce uzunluklarına göre sıralanacaktır. Aynı uzunlukta olan elemanlar ise alfabetik dizilime göre sıralanacaktır.

C# ile Geçici Dosya Oluşturmak

Uygulama geliştirirken bazen geçici olarak dosya oluşturmak zorunda kalabiliriz.

Fakat dosya oluşturma ve yazma iznimizin olduğu bir klasör olmasını her zaman garantileyemeyebiliriz.

Ayrıca, oluşturduğumuz dosya ile işimiz bittiğinde silinmesini de kendimizin yönetmesi gerekir.

Aşağıdaki kod ise, Windows‘un geçici dosyalar (temporary files) klasöründe rastgele isimde bir dosya oluşturur. Böylece geçici dosyanın temizlenmesi işini bizim yerimize Windows üstlenir.

public static string GeciciDosyaOlustur(string OnEk, string Uzanti)
{
	if (OnEk == null)
		throw new ArgumentNullException("OnEk");
	if (Uzanti == null)
		throw new ArgumentNullException("Uzanti");

	return Path.Combine(Path.GetTempPath(), String.Format("{0}.{1}.{2}", OnEk, Guid.NewGuid(), Uzanti));
}