13 Mart 2013 Çarşamba

C# Erişim Belirleyiciler (Access Modifiers)


Bu makalede sizlere erişim belirteçlerini anlatacağım.

Öncelikle erişim belirleyicilerin (access modifiers) nerelere uygulandığını bilmemiz lazım; C# projesinde tanımlanmış tüm varlıklara uygulanabilir; buna class, struct, function, method, property ve class seviyesindeki tüm değişkenler dahildir.

Peki, neden erişim belirleyicilere ihtiyaç duyarız?

Çünkü, uygulamamızda kullandığımız varlıkların bulundukları kod bloğunun dışından erişilip/erişilemeyeceğini belirlemek isteriz.

C# dilinde tanımlı erişim belirleyiciler (access modifiers);

Public: Public olarak tanımlanan öğe, kod bloğunun içinde ve dışında tamamen erişilebilirdir. Yani, hiçbir kısıtlama yoktur.

Protected: Protected olarak tanımlanan öğe, sadece tanımlandığı class'ın içinde ve o class'tan türetilmiş diğer class'ların içinde erişilebilirdir.

Internal: Internal olarak tanımlanan öğe, bulunduğu assembly'nin (Dll veya Exe dosyası) içinde erişilebilirdir. Dll veya Exe dosyasının içerisinde erişim için kısıtlama yoktur, ama dışarıdan erişilemez.

Protected internal: Protected internal erişim belirleyicisi, protected ve internal erişim belirleyicilerinin VEYA (OR) işlemiyle birleştirilmiş halidir. protected internal olarak tanımlanmış öğe, tanımlandığı class'ın içinde ve o class'tan türetilmiş diğer class'ların içinde erişilebilir. Ayrıca, aynı assembly içinde olmasalar dahi, tanımlandığı class'tan türetilmiş diğer class'ların içinde de erişilebilirdir.

Private: Private olarak tanımlanan öğe, sadece tanımlandığı class'ın içerisinde erişilebilirdir. En katı erişim belirleyicidir.

Aslında CLR içinde tanımlı bir erişim belirleyici daha vardır. FamilyAndAssembly olarak bilinir. C# kelimeleri ile benzetmeye çalışırsak, protected VE (AND) internal erişim belirleyicisidir. C# dili bu erişim belirleyicisini desteklemez, eğer kullanmanız gerekiyorsa, C++ ve direk IL yazmanız gerekmektedir.

Class veya struct'lar ya public, ya da internal olabilir, varsayılan olarak internal erişim belirleyicisine sahiptirler.

Varsayılan olarak class içerisinde tanımlı öğeler private erişim belirleyicisine sahiptirler.

Struct içerisinde tanımlı öğeler public, internal veya private olabilirler. struct'lar türetmeyi desteklemediği için protected ve protected internal erişim belirleyicisine zaten ihtiyaçları yoktur.
Devamını Oku

C# İle Resmi Piksellerine Ayırma

Bu dersimizde C# ile bir resmi piksellerine ayıracağız.

Başlayalım:

Öncelikli olarak bir, bitmap oluşturmalıyız;

var goruntuGenislik = orjinalGoruntu.Width;
var goruntuYukseklik = orjinalGoruntu.Height;
 
var piksellestirilmisGoruntu = new Bitmap(goruntuGenislik, goruntuYukseklik);


Ardından pikselleştirme için önceden karar verdiğimiz boyutlar çerçevesinde orjinal görüntü pikselleri içerisinde dolaşmaya başlayalım;

for (var i = 0; i < goruntuGenislik; i += pikselBoyutu) {
    for (var j = 0; j < goruntuYukseklik; j += pikselBoyutu) {
    //...   
   }
}


Alan içerisinde merkezdeki piksel'i alalım. Bu piksel daha sonra sonuç görüntümüzde bu alana denk gelen pikseller için kullanacağımız rengi belirlememize yardımcı olacak.
xOfseti = yOfseti = pikselBoyutu / 2;
 
if (i + xOfseti >= goruntuGenislik) {
    xOfseti = goruntuGenislik - i - 1;
}
 
if (j + yOfseti >= goruntuYukseklik) {
    yOfseti = goruntuYukseklik - j - 1;
}
 
var piksel = orjinalGoruntu.GetPixel(i + xOfseti, j + yOfseti);


Son Olarak;
for (var x = i; x < i + pikselBoyutu && x < goruntuGenislik; x++) {
    for (var y = j; y < j + pikselBoyutu && y < goruntuYukseklik; y++) {
        piksellestirilmisGoruntu.SetPixel(x, y, piksel);
    }
}



Resmi Picture Box'a Aktarmak İçin;

 pictureBox1.Image = piksellestirilmisGoruntu;
 


Kolay gelsin.
Devamını Oku

C#'da Girilen Bir Sayıyı Başka bir tabana çevirmek


Merhabalar, 

Bu dersimizde C#'da 10'luk tabandaki bir sayıyı, başka bir tabana çeviren küçük bir uygulama yazacağız. 

İlk Olarak Visual Studio Programınızı Açıp, Yeni bir proje oluşturup ekranda görmüş olduğunuz tasarımı gerçekleştirin.

Sahneye iki adet textbox, Bir buton ve birde Sonuç Degeri için Label Atıyoruz. 

http://resim.sanalkurs.net/uploads/dd1_1.jpg

Daha Sonra hesapla Butonumuza çift tıklayıp içerisine Aşagıda yer alan kodları yerleştirelim.

private void button1_Click(object sender, EventArgs e)
{
long x; //Long tipinde bir değişken tanımlıyoruz. Çevirilecek Sayı İçin
int n; // integer tipinde bir değişken tanımlıyoruz. Çevirilecek Taban İçin
try // Kodlarımızı try catch blogu içerisinde yazıyor,olacak bir hatayı görmek için
{
x = int.Parse(textBox1.Text); //textbox1 deki değeri x'e aktarıyoruz.
n = int.Parse(textBox2.Text); //textbox2 deki değeri n'e aktarıyoruz.
lblSonuc.Text = tabancevir(x,n);// lblSonuc diye bir label sahneye attıktan sonra bunada tabancevir fonksiyonunu atıyoruz. Fonksiyon çalışacak ve geriye deger döndürüp, lblSonucta Yazacaktır.
}
catch (Exception)
{
throw; // olası bir hatayı burada ekrana yazdırabilirsiniz bir messagebox kullanarak.
}
}
string tabancevir(long x, int n) { //tabancevir Fonksiyonumuzu yazmaya başlayalım. dışarıdan iki parametre alacak çünkü iki tane deger gönderiyoruz bu fonksiyona.
if(n<2) // taban 2'den Küçük Olamayacağı için direk -1 degerini döndürüyoruz. Eğer taban degeri 2 den küçük girilirse.
return "-1";
long b; // long tipinde bir değişken tanımlıyoruz. Mod değerlerini Tutmak İçin.
string s = ""; // string tipinde bir değişken tanımlayıp, Sonuç degeri bu değişkende tutulacaktır.
while (x >= n) { // Sayı Tabandan Küçük olana kadar döngümüz çalışacaktır.
b = x % n; // sayının tabandaki kalanı alınıp, b değişkenine aktarılıyor.
x = x / n; Sayı sürekli tabana bölünüyor.ve X in değeri sürekli Değişiyor.
if (b > 9) // Eğer Sayının tabana bölümünde kalan 9 dan büyükse
s = (char)(55 + b) + s; // ASCII Karakter Tablosunda Başlangıç Olan A harfinin Değeri 65 olduğundan burada böyle bir işlem kullanıyoruz. 9 dan Büyük Rakamlar harfe Çevrilecek Bu sayede.
else
s = b + s;
}
if (x > 9)
s = (char)(55 + x) + s;
else
s = x + s;
return s;
}
}
}


http://resim.sanalkurs.net/uploads/f1_3.jpg

http://resim.sanalkurs.net/uploads/f2_3.jpg
Devamını Oku

C# İle Operatörlere Aşırı Yüklemek

NET çatısı altında operatörleri aşırı yüklemek mümkündür. +, -, *, / gibi operatörleri özel sınıflarınız için aşırı yükleyebilirsiniz.

Aşırı yüklemek .NET çatısı altında bir HATA DEĞİLDİR. Bir fonksiyonu aynı projede iki kez kullanabilirsiniz (dönüş tipleri aynı, parametreleri farklı olmak şartıyla).

Bu dersimizde bir sınıfı +, -, *, / gibi operatörlerle aşırı yüklemeyi öğreneceğiz.

public class KUP
{
public int a, b, c;
public KUP(int sa, int sb, int sc)
{
a = sa;
b = sb;
c = sc;
}


public static KUP operator +(KUP x, KUP y)
{
KUP yeni = new KUP();
yeni.a = x.a + y.a;
yeni.b = x.b + y.b;
yeni.c = x.c + y.c;
return yeni;
}
}


Bu sınıfı tanımladığımızda herhangi bir fonksiyonda

KUP k = new KUP(10, 10, 30);
KUP m = new KUP(20, 20, 50);

KUP yeni_kup = k + m; // Operatörü Kullandık


yeni_kup için; a = 30 , b = 30, c = 80 oldu.

NOT: Operatörler tanımlandıkları sınıf için kullanılabilirler. Örneğin int ve int türünden iki değişken için KUP sınıfının operatörünü kullanmak mümkün değildir.

Operatörleri orjinal kullanımlarını yansıtacak şekilde aşırı yüklemek programcı için daima daha anlaşılırdır. Örneğin + operatörünü bölme işlemi için de kullanabilirsiniz fakat bu pek kullanışlı bir tanımlama olmayacaktır.
Devamını Oku