Arşiv

‘C#’ Kategorisi için arşiv

Hem benzersiz hem de geçici dosya oluşturmanın en kolay yolu

Geliştirdiğiniz bir uygulamada, geçici bir dosyaya ihtiyacınız olduğunu düşünelim. Ama daha önce oluşturulmuş bir dosyanın ismini vermediğinizden emin olmak istiyorsunuz.

  • Kullanıcının geçici dosyaları hangi dizinde tuttuğunu bulmak
  • Rastgele bir dosya ismi üretmek, eğer bu dosya isminde bir dosya varsa, yeni bir dosya ismi bulana kadar rastgele yeni dosya ismi üretmek
  • Ürettiğiniz rastgele isme sahip yeni bir dosya oluşturmak

adımlarını gerçekleştirmek yerine, Path.GetTempFileName() method’unu kullanabilirsiniz.

string GeciciDosya = Path.GetTempFileName(); /// GeciciDosya değişkeni kullanıcının Temp dizininde 0-byte boyutlu bir dosyanın tam dosya yolunu içerir.

using (StreamWriter sw = File.OpenText(GeciciDosya))
{
	sw.WriteLine("Geçici Dosyaya yazılacak bilginin ilk satırı");
}

Benim kullandığım bilgisayarda, Path.GetTempFileName() methodu geriye “C:\Documents and Settings\EnginPolat\Local Settings\Temp\tmp3A.tmpstring değeri döndürdü.

Eğer rastgele dosyanın gerçekten oluşturulmasını değil, sadece dosya isminin üretilmesini istiyorsanız; Path.GetRandomFileName() methodunu kullanabilirsiniz;

string DosyaAdi = Path.GetRandomFileName(); /// DosyaAdi değişkeni sadece rastgele bir dosya ismini içerir.

Benim bilgisayarımda, Path.GetRandomFileName() methodu geriye “z4a2sa4a.49estring değeri döndürdü.

Kalıtımı engellemek (sealed anahtar kelimesi)

Yazdığınız bir sınıftan kalıtım yoluyla başka sınıflar üretilmesini engellemek istiyor olabilirsiniz.

Yapmanız gereken sınıfınızı sealed anahtar kelimesi ile “mühürlemek” olmalıdır. Böylece sınıfınızdan yeni sınıflar türetilemeyecektir.

sealed class AnaSinif
{
// Sınıf üyeleri
}

AnaSinif class‘ımız sealed olduğu için, yeni sınıf türetilirken base class olamayacaktır;

class TuretilmisSinif : AnaSinif
{
// Derleme zamanında hata oluşur (compile-time error)
}

Not : struct’lar her zaman sealed ile mühürlenmiş gibi davranırlar. struct’lar kalıtım (inheritance) desteklemez

Tüm sınıfın kalıtım yoluyla aktarılmasını engellemek yerine, tek bir method’un override edilmesini engellemek istiyor olabilirsiniz.

Bu durumda yapmanız gereken, sadece ilgili method‘u sealed ile “mühürlemek” olmalıdır;

class AnaSinif
{
	public virtual void Goster()
	{
	}
}

class TuretilmisSinif : AnaSinif
{
// Bu kodda problem yok
// AnaSinif'tan gelen Goster() method'unu override eder
// Aynı zamanda sealed ile "mühürler"
	public sealed override void Goster()
	{
	}
}

class TekrarTuretilmisSinif : TuretilmisSinif
{
// Bu kod derlenmez. Hata oluşur
// TuretilmisSinif class'ında Goster() method'u sealed anahtar kelimesi ile "mühürlenmişti"
	public override void Goster()
	{
	}
}

Dosya veya Dizin isimlendirirken kullanmamanız gereken karakterler

System.IO namespace‘inde yer alan Path class‘ının

GetInvalidFileNameChars()

GetInvalidPathChars()

methodlarını kullanarak dosya veya dizin isimlendirirken kullanmamanız gereken karakterleri bulabilirsiniz.

Her iki method’dan da geriye char[] döner.

MSDN’de şuradaki makaleden GetInvalidFileNameChars() methodu ile ilgili ayrıntılı bilgiye ulaşabilirsiniz.

MSDN’de şuradaki makaleden GetInvalidPathChars() methodu ile ilgili ayrıntılı bilgiye ulaşabilirsiniz.

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

.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();
		}
	}
}

FileStream sınıfına Kaydet() ExtensionMethod’u yazalım

FileStream sınıfına yazacağımız Save() method’u sayesinde, aşağıdaki kodu kolaylıkla yazabilir olacağız. Üstelik bir tane de overload yazarak, varolan dosyanın üstüne yazmasını engelleyip, yeni bir dosya adı oluşturup yazma işlemine devam ettirebileceğiz.

fs.Kaydet("c:\\dosya_adi.uzanti");

Eğer aynı kodu, ikinci bir boolean parametreye true değeri vererek çağırırsak, klasörde dosya_adi.uzanti dosyası varsa dosya_adi[1].uzanti dosyasına yazmayı deneyecek, eğer bu dosya da varsa, dosya_adi[2].uzanti dosyasına deneyecek, vs..

fs.Kaydet("c:\\dosya_adi.uzanti", true);

İşte kodumuz;

namespace ExtensionManager
{
	public static class Extensions
	{
		public static string Kaydet(this FileStream Dosya, string Dizin)
		{
			return Dosya.Kaydet(Dizin, false);
		}

		public static string Kaydet(this FileStream Dosya, string Dizin, bool UstuneYaz)
		{
			int DosyaSayac = 1;

			string _Dizin = Path.GetDirectoryName(Dizin);

			if (!Directory.Exists(_Dizin))
				Directory.CreateDirectory(_Dizin);

			int DosyaBoyu = Convert.ToInt32(Dosya.Length);
			string DosyaAdi = Path.GetFileName(Dosya.Name);

			Byte[] b = new Byte[DosyaBoyu];
			Dosya.Read(b, 0, DosyaBoyu);

			string root = Path.GetDirectoryName(Dizin) + "\\" + Path.GetFileNameWithoutExtension(Dizin);

			while (!UstuneYaz && File.Exists(Dizin))
				Dizin = root + "[" + DosyaSayac++.ToString() + "]" + Path.GetExtension(Dizin);

			File.WriteAllBytes(Dizin, b);

			return Path.GetFileName(Dizin);
		}
	}
}

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 engin.polat 2 comments

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?

Categories: C#, Programlama Tags: , , ,

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.

Kısa Sınav – 14

18 Şubat 2010 engin.polat 1 Yorum

Kısa bir soru;

var x = 10;

x += x- -;

x değeri ne olur?

Sorunun doğru cevabı için; Devamını Oku…

Categories: C#, Programlama Tags: , , ,

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));
}

Bu kodda ne yanlış var? – 3

18 Şubat 2010 engin.polat 1 Yorum

Aşağıdaki kodu çalıştırdığımızda Console’a “Bir”, “İki”, “Üç” yazdığını görüyoruz.

Sizce neden “Dört” elemanı yazılmıyor?

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

namespace BuKoddaNeYanlisVar
{
    class Program
    {
        private List<string> _items = new List<string>();

        public List<string> Items
        {
            get { return _items.ToList(); }
            set { _items = value; }
        }
        static void Main(string[] args)
        {
            Program program = new Program();
            program.Items = new List<string> { "Bir", "İki", "Üç" };
            program.Items.Add("Dört");
            foreach (var item in program.Items)
                Console.WriteLine(item);
            Console.ReadLine();
        }
    }
}

C# Uygulamalarında XML Dokümantasyonu Kullanmak

C# ile Uygulama Geliştirirken Yorum Satırlarını Kullanmak yazımda başladığım konuya XML Dokümantasyonunu eklemem gerekir.

Geleneksel C-tarzı yorum satırlarına ilave olarak C# geliştirilen kodların Xml Dokümantasyonunu otomatik olarak çıkartabilmek için, güçlü yorum operatörlerine sahiptir.

Bu yorum operatörleri (///) ile başlayan satırlara yazılır.

Aşağıdaki listedeki operatörler, derleyici (compiler) tarafından tanınır ve desteklenir;

<c> Tek satırı C# kodu olarak işaretler. Örneğin: <c>string AdSoyad = “Engin Polat”;</c>
<code> Birden çok satırı C# kodu olarak işaretler.
<example> İlgili satırları “örnek kod” olarak işaretler.
<exception> Exception sınıfını dokümante eder. (Derleyici(compiler) tarafından kontrol edilir)
<include> Başka bir dokümantasyon dosyasından yorum ekler. (Derleyici(compiler) tarafından kontrol edilir)
<list> Dokümantasyona liste ekler.
<param> Method parametresini dokümante eder. (Derleyici(compiler) tarafından kontrol edilir)
<paramref> Kelimenin parametre olduğunu işaretler. (Derleyici(compiler) tarafından kontrol edilir)
<permission> Öğeye erişim belirleyicisini dokümante eder. (Derleyici(compiler) tarafından kontrol edilir)
<remarks> Öğeye açıklama ekler.
<returns> Method’un dönüş tipini dokümante eder.
<see> Başka bir parametreye çapraz-referans ekler. (Derleyici(compiler) tarafından kontrol edilir)
<seealso> Açıklamaya “buna da bakın” parçası ekler. (Derleyici(compiler) tarafından kontrol edilir)
<summary> Öğenin kısa açıklamasını dokümante eder.
<value> Özelliği (property) tanımlar.

Örnek olması açısından, aşağıdaki Matematik sınıfını dokümantasyonu ile birlikte yazıyorum;

//Matematik.cs
namespace Engin.Polat
{
	///<summary>
	///  Engin.Polat.Matematik sınıfı.
	///  İki rakamın toplanmasına yaran
	///  Topla method'unu içerir.
	///</summary>
	public class Matematik
	{
		///<summary>
		///  İki rakamın toplanmasını sağlar.
		///</summary>
		///<example>Örnek olarak: Topla(3, 5);</example>
		///<returns>Toplama işleminin sonucu (int)</returns>
		///<param name="x">Toplama işleminin ilk rakamı</param>
		///<param name="y">Toplama işleminin ikinci rakamı</param>
		public int Topla(int x, int y)
		{
			return x + y;
		}
	}
}

Derleme sonucu oluşan Xml dokümanı aşağıdaki gibidir;

<?xml version="1.0"?>
<doc>
	<assembly>
		<name>ConsoleApplication4</name>
	</assembly>
	<members>
		<member name="T:Engin.Polat.Matematik">
			<summary>
				Engin.Polat.Matematik sınıfı.
				İki rakamın toplanmasına yaran
				Topla method'unu içerir.
			</summary>
		</member>
		<member name="M:Engin.Polat.Matematik.Topla(System.Int32,System.Int32)">
			<summary>
				İki rakamın toplanmasını sağlar.
			</summary>
			<example>Örnek olarak: Topla(3, 5);</example>
			<returns>Toplama işleminin sonucu (int)</returns>
			<param name="z">Toplama işleminin ilk rakamı</param>
			<param name="y">Toplama işleminin ikinci rakamı</param>
		</member>
	</members>
</doc>

Dikkat ederseniz, derleyici (compiler) bizim için ve elementlerini eklemiştir. Her element’i name özelliğine sahiptir ve değer olarak öğenin tam adını içerir.

Değerin ilk harfi özel bir anlam taşır;

T : Type
F : Field
M : Member

Kısa Sınav – 13

Geliştirdiğiniz bir Windows Forms uygulamasında aşağıdaki depolar.xml dosyasına sahipsiniz;

<? xml version="1.0" encoding="utf-8" ?>
<Depolar>
	<Depo Adi="DP001" Sehir="İstanbul"></Depo>
	<Depo Adi="DP002" Sehir="Ankara"></Depo>
	<Depo Adi="DP003" Sehir="Adapazarı"></Depo>
	<Depo Adi="DP004" Sehir="Elazığ"></Depo>
	<Depo Adi="DP005" Sehir="İzmir"></Depo>
</Depolar>

Bu Xml dosyasındaki depo isimlerini bir combobox‘a doldurmanız gerekmekte.

Sizce hangi yol tercih edilmeli?

  • Xml dosyasının şeması ile aynı serilize olabilen bir class geliştirilmeli. Geliştirilen class XmlDataDocument class’ı ile birlikte kullanılmalı
  • ApplicationSettingBase class’ından inherit olan yeni bir class yazılmalı
  • Xml dosyasının şeması ile aynı serilize olabilen bir class geliştirilmeli. Geliştirilen class XmlSerializer class’ı ile birlikte kullanılmalı
  • ConfigurationSection class’ından inherit olan yeni bir class yazılmalı

Sorunun doğru cevabı için; Devamını Oku…

C# ile Uygulama Geliştirirken Yorum Satırlarını Kullanmak

Bu yazımda aslında çok kolay bir konuyu işliyor olacağım, C# kodunuza yorum satır(lar)ı eklemek.

Bu konuyu yazmamdaki asıl amacım, BilgeAdam‘daki öğrencilerim için hatırlatma niteliğinde olmasıdır.

C# geleneksel C-tarzı yorum satır(lar)ını destekler; (// …) veya (/* … */)

// Bu satır örnek olarak yorum haline getirilmiştir.
/* Bu satır örnek olarak yorum haline getirilmiştir. */

Tek satır yorum operatörünün (//) satırda buluduğu noktadan satırın sonuna kadar herşey yorum olarak kabul edilir.

Çok satır yorum operastöründe (/* */), başlangıç operatöründen (/*) bitiş operatörüne (*/) kadar herşey yorum olarak kabul edilir.

Tek satırlı ve çok satırlı yorumlar şu şekilde yazılabilir;

// Tek satırlı yorum
/* Bu satırlar
çok satırlı yorum
için iyi bir örnektir. */

Aşağıdaki kod’da geçerlidir;

Console.WriteLine(/* İşte yorum! */ “Kodun burası derlenir.”);

Aynı zamanda aşağıdaki gibi kodlar sayesinde, satır içerisinde kod parçalarına yorum yazabilmek mümkündür;

EkranaCiz(Boy, /* Yukseklik */ 250);

Tabiki string karakterleri arasındaki yorum operatörleri, normal karakter olarak değerlendirilecektir;

string mesaj = “/* Bu normal bir metin değişkenidir */”;

Categories: C#, Programlama Tags: , , , ,

Kısa Sınav – 12

18 Şubat 2010 engin.polat 2 comments

Kod yazma yeteneklerimizi ölçebileceğimiz sitelerden Codility‘de test olarak yapabileceğiniz bir soru bulunuyor. Aşağıdaki görselde soruyu görebilirsiniz.

Codility sitesinde yayınlanan demo test

Benim çözümüm devam eden sayfada. Sizde çözümünüzü yazın bakalım.

Devamını Oku…

LINQ ile Dosya Sisteminde Sorgulama Yapmak

Yazdığımız uygulamalarda dosya sisteminde arama yapmaya ihtiyaç duyabiliriz. Bu durumda genelde döngüler yazarız. Peki LINQ kullanamaz mıyız? Üzerinde biraz çalıştıktan ve araştırma yaptıktan sonra, aşağıdaki kodu elde ettim;

private IEnumerable<FileInfo> DosyaListesi(DirectoryInfo KokDizin, string Uzanti, string DosyaAdiParcasi)
{
	foreach (var f in KokDizin.GetFiles().Where(Dosya => Dosya.Extension == Uzanti && Dosya.Name.Contains(DosyaAdiParcasi)))
		yield return f;

	foreach (DirectoryInfo d in KokDizin.GetDirectories())
		foreach (var f in DosyaListesi(d, Uzanti, DosyaAdiParcasi))
			yield return f;
}

Gördüğünüz gibi fonksiyon, parametre olarak aramaya başlanacak kök dizini, arama yapılacak dosyanın uzantısını ve dosya isminde bir parçayı alıyor, geriye FileInfo sınıfında liste döndürüyor.

İlk foreach döngüsünde kök dizinde parametre ile alınmış kriterlere göre arama yapılıyor ve yield anahtar kelimesi ile, bulunan her sonuç dönüş kümesine ekleniyor.

İkinci (ve üçüncü) foreach döngülerinde ise, recursive (kendini tekrarlamalı) olarak DosyaListesi() fonksiyonu kendi kendisini çağırarak, arama işlemini alt klasörlerde de yapıyor.