Var | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar var

C#’ta assembly: InternalsVisibleToAttribute kullanımı

16 July 2016 Yorum yapılmamış

C#‘ta kullanabildiğimiz erişim belirleyicileri (Access Modifiers) daha önce C# Erişim Belirleyiciler – Access Modifiers isimli makalede ele almıştım.

C# kurallarına göre, bir proje diğer projeyi referans olarak görüyorsa public erişim belirleyicili (access modifier) olan class‘lara erişebilir. internal access modifier olan class‘lara ise referans olarak gören projeden erişilemez, sadece tanımlandığı projeden erişilebilir.

Göstermesi, anlatmasından kolay olacak sanırım.

Hemen Visual Studio 2015 açalım ve yeni bir Console Application projesi oluşturalım;

Solution‘a sağ tuşla tıklayalım ve Add Project menüsünden bir tane Class Library ekleyelim ve Class1.cs dosyasının ismini VeritabaniErisimi.cs olacak şekilde değiştirelim;

Yeni oluşturduğumuz Class Library projesini Console Application projesinin referans‘larına ekleyelim;

Böylece solution‘ımız aşağıdaki gibi gözükmeli;

VeritabaniErisimi.cs dosyasını açalım ve VeritabaniErisimi class‘ının erişim belirleyicisini (Access Modifier) internal yapalım.

Console Application projesindeki Program.cs dosyasını açar ve içerisinden VeritabaniErisimi isimli class‘a erişmek istersek, internal access modifier‘ına sahip olduğu için erişemeyeceğiz.

Bu noktada proje derlenemez ve ‘VeritabaniErisimi’ is inaccessible due to its protection level hatası verir.

Çünkü; internal access modifier‘ına sahip class‘lar sadece kendi projelerinde kullanılabilir, erişebilirlerdir. Kendi projelerinin dışından erişilemezler.

Eğer istersek, Kutuphane isimli Class Library‘deki internal access modifier‘ına sahip sınıfların başka projelerden de erişilebilir olmasını sağlayabiliriz.

Bunun için namespace üstünde InternalsVisibleTo Attribute‘ünü kullanmamız lazım.

Öncelikle VeritabaniErisimi.cs dosyasını açalım (aslında Kutuphane projesindeki herhangi bir csharp dosyasını açsak olur) ve using kısmına System.Runtime.CompilerServices ekleyelim, namespace üzerine de [assembly: InternalsVisibleTo(“PROJEADI”)] yazalım.

InternalsVisibelTo attribute‘ünün parametresi olan PROJEADI, internal access modifier‘ına sahip class‘ların görünür olmasını istediğimiz projelerin adı olmalı. Örneğin;

Kısa Sınav – 17

10 October 2011 5 yorum

Aşağıdaki kod bloğunu çalıştırdığımızda ekranda hangi sonuçlar yazar?

Console.WriteLine(26 % 4 * 3);

Console.WriteLine(4 / 3 + 2);

var fiyat = 4;
var indirim = 5;

Console.WriteLine(fiyat - indirim++);

byte rakam = 255;

Console.WriteLine(++rakam);

HTML TextArea elemanına girilebilecek karakter sayısını sınırlamak

17 September 2010 7 yorum

HTML‘de metin kutularına (<input type=”text” />) girilebilecek karakter sayısını maxlength özelliği ile kısıtlayabiliyoruz;

<input type="text" id="AdSoyad" maxlength="75" />

Fakat TextArea elemanı için maxlength özelliği yer almamaktadır.

Eğer TextArea elemanı için maxlength özelliğini sağlamak istersek, sayfamıza javascript kodu eklememiz gerekir.

Örneğin, ilgili TextArea elemanına 100 karakterlik bir sınır koymak istiyorsak, aşağıdaki javascript kodunu sayfamıza ekleyebiliriz;

<script type="text/javascript">
	function TextAreaKarakterSayisiDogrula()
	{
		var sonSayi = 100 - document.getElementById("Adres").value.length;
		if (sonSayi >= 0)
		{
			document.getElementById("KalanKarakterSayac").innerHTML = sonSayi;
		}
		else
		{
			document.getElementById("Adres").value = document.getElementById("Adres").value.substring(0, 100);
			document.getElementById("KalanKarakterSayac").innerHTML = 0;
		}
	}
</script>

<textarea id="Adres" onkeyup="TextAreaKarakterSayisiDogrula()" cols="20" rows="5"></textarea>

Kalan karakter sayısı : <span id="KalanKarakterSayac">100</span>

Örnek kodu herhangi bir html sayfasına koyarsanız, farklı tarayıcılarda sorun çıkartmadan çalışacaktır.

C# İsimsiz Tipler – Anonymous Types

21 January 2010 2 yorum

Sadece bir method içerisinde kullanacağınız basit class‘lara kaç defa ihtiyaç duydunuz? Böyle bir class’a her ihtiyaç duyduğunuzda yapmanız gereken, yeni bir class oluşturup, bütün tanımlama kodlarını (private alanlar, public alanlar, vs.) yazmaktır.

C# dili, İsimsiz Tip (Anonymous Type) tanımlamaya izin veriyor. Üstelik, private ve public öğelerin oluşturulmasını ve yönetilmesini C# dilinin kendisi üstleniyor.

public class HataLogla()
{
	var Hata = new { Mesaj = "Hata Mesajının Kendisi", Tarih = DateTime.Now, Yer = "XClass.YMethod" };
	var Kullanici = new { Id = 42, AdSoyad = "Engin Polat", Yonetici = "Ali Veli" };

	string Loglanacak = string.Format("Hata Mesajı: {0}\nTarih: {1} {2}\nHatanın Oluştuğu Yer: {3}\n\nKullanıcıId: {4}\nKullanıcı Adı: {5}\nYöneticisi: {6}", Hata.Mesaj, Hata.ToShortDateString(), Hata.Tarih.ToLongTimeString(), Hata.Yer, Kullanici.Id, Kullanici.AdSoyad, Kullanici.Yonetici);

	File.WriteAllText(Loglanacak, @"C:\Log\Log.txt");

	MessageBox.Show(Hata.Mesaj, Hata.Tarih);
}

Yukarıdaki kodda yer alan Hata ve Kullanici değişkenlerinin tipleri, derleme zamanında derleyici tarafından otomatik oluşturulur. Eğer method‘un içerisine aşağıdaki kodları eklersek;

MessageBox.Show("Hata değişkeninin tipi : " + Hata.GetType().ToString());
MessageBox.Show("Kullanici değişkeninin tipi : " + Kullanici.GetType().ToString());

Mesaj kutularında şu değerleri görürüz;

Hata değişkeninin tipi : <>f_AnonymousType0’3[System.String,System.DateTime,System.String]
Kullanici değişkeninin tipi : <>f_AnonymousType0’3[System.Int32,System.String,System.String]

Farkettiğiniz gibi, böyle bir tip oluşturmaya çalışırsak, derleme zamanında hata alırız, ama C# derleyicisi bizim için bu tipleri oluşturuyor.

Değişkenin tipini veremeyeceğimiz için, C# diline var anahtar kelimesi eklenmiştir.

var anahtar kelimesi sayesinde, değişkenin tipi atandığı değerden otomatik olarak çözümleniyor.

İsimsiz Tipler (Anonymous Types) IDisposable interface’ini uygulamadığı için, Disposable olamazlar.

Eğer yukarıdaki örneği geleneksel kodlama teknikleri ile yazacak olsaydık;

public class HataBilgi
{
	private string _Mesaj = string.Empty;
	private DateTime _Tarih = DateTime.Now;
	private string _Yer = string.Empty;

	public string Mesaj
	{
		get
		{
			return _Mesaj;
		}
		set
		{
			_Mesaj = value;
		}
	}

	public DateTime Tarih
	{
		get
		{
			return _Tarih;
		}
		set
		{
			_Tarih = value;
		}
	}

	public string Yer
	{
		get
		{
			return _Yer;
		}
		set
		{
			_Yer = value;
		}
	}

	public HataBilgi(string Mesaj, DateTime Tarih, string Yer)
	{
		this.Mesaj = Mesaj;
		this.Tarih = Tarih;
		this.Yer = Yer;
	}
}

public class KullaniciBilgi
{
	private int _Id = 0;
	private string _AdSoyad = string.Empty;
	private string _Yonetici = string.Empty;

	public int Id
	{
		get
		{
			return _Id;
		}
		set
		{
			_Id = value;
		}
	}

	public string AdSoyad
	{
		get
		{
			return _AdSoyad;
		}
		set
		{
			_AdSoyad = value;
		}
	}

	public string Yonetici
	{
		get
		{
			return _Yonetici;
		}
		set
		{
			_Yonetici = value;
		}
	}

	public KullaniciBilgi(int Id, string AdSoyad, string Yonetici)
	{
		this.Id = Id;
		this.AdSoyad = AdSoyad;
		this.Yonetici = Yonetici;
	}
}

public class HataLoglama
{
	HataBilgi Hata = new HataBilgi("Hata Mesajının Kendisi", DateTime.Now, "XClass.YMethod");
	KullaniciBilgi Kullanici = new KullaniciBilgi(42, "Engin Polat", "Ali Veli");

	string Loglanacak = string.Format("Hata Mesajı: {0}\nTarih: {1} {2}\nHatanın Oluştuğu Yer: {3}\n\nKullanıcıId: {4}\nKullanıcı Adı: {5}\nYöneticisi: {6}", Hata.Mesaj, Hata.ToShortDateString(), Hata.Tarih.ToLongTimeString(), Hata.Yer, Kullanici.Id, Kullanici.AdSoyad, Kullanici.Yonetici);

	File.WriteAllText(Loglanacak, @"C:\Log\Log.txt");

	MessageBox.Show(Hata.Mesaj, Hata.Tarih);
}

İsimsiz Tip yeteneklerini kullanarak yazdığımızda ise;

public class HataLogla()
{
	var Hata = new { Mesaj = "Hata Mesajının Kendisi", Tarih = DateTime.Now, Yer = "XClass.YMethod" };
	var Kullanici = new { Id = 42, AdSoyad = "Engin Polat", Yonetici = "Ali Veli" };

	string Loglanacak = string.Format("Hata Mesajı: {0}\nTarih: {1} {2}\nHatanın Oluştuğu Yer: {3}\n\nKullanıcıId: {4}\nKullanıcı Adı: {5}\nYöneticisi: {6}", Hata.Mesaj, Hata.ToShortDateString(), Hata.Tarih.ToLongTimeString(), Hata.Yer, Kullanici.Id, Kullanici.AdSoyad, Kullanici.Yonetici);

	File.WriteAllText(Loglanacak, @"C:\Log\Log.txt");

	MessageBox.Show(Hata.Mesaj, Hata.Tarih);
}

Aradaki fark açıkça ortada!