Value and Reference Types

by Yasin Sirkecili 10. February 2008
Değer Tipleri ve Referans Tipleri  C# Değer tipi ve referans tipi olmak üzere iki ayrı değişken yönetimi mevcuttur. 
  • Değer tipleri programın çalışma zamanında değerleri ile birlikte belleğin stack bölgesinde türü ve içeriği ile saklanan değişken türüdür. Esnekliği yüksektir.
 
  • Referans tipleri ise belleğin Heap bölgesinde saklanan ancak bellekteki yerinin stack bölgesinde 4 byte olarak tanımlandığı değişken türüdür. Bu 4byte = 32 bit lik referans boyutu işletim sistemine bağlıdır. Eğer 64 Bit bir işletim sistemi kullanıyorsanız stack bölgesinde heap bölgesindeki herhangi bir değişkeni referans eden pointer değerinin boyutu 8 byte yani 64 bit olacaktır.

  Değer tiplerinin aşağıdaki örnekte olduğu gibi birbirine eşitlenmesi kopyalama yöntemi ile gerçekleştiğinden birbirinden bağımsızdırlar.

int i1 = 5;
int i2 = i1;
Response.Write(i2.ToString()); // 5


dediğimizde stack bölgesindeki i1 değişkeninin içeriği yine stack bölgesinde oluşan ikinci değişkenimiz olan i2 nin içeriğine kopyalanır. Bu durumda i1 değişkeninin değerinin değişmesi i2 değişkenini etkilemez.

 Değer tipleri genellikle sınırları belli olan değişken türlerini içerir. Yani Stack bölgesinde saklanan bir değişkenin bellekte kapladığı alan her daim sabittir. Ancak referans tiplerinde bu durum 32 bitlik bir OS için stack bölgesine 4 byte olarak yansırken tanımlanan değişkenin boyut sınırları bilinmediğinden heap bölgesinde ilgili değişkene ait boyut tahmin edilemez.

 string y = “yasin”;
 
string s = “sirkecili”; 

Şeklinde yapılan bir tanımlamada string değişken türü System.String sınıfından gelen bir referans tipi olduğundan belleğin stack bölgesinde iki farklı değişken için 4byte ,4byte olmak üzere iki farklı alan tanımlanır. Heap bölgesinde ise y değişkeni 10byte s değişkeni ise 18 byte yer kaplar.

 Bunun ölçümünü ; 
string y = "yasin";
string s = "sirkecili";
char[] bar = y.ToCharArray();
char[] bar2 = s.ToCharArray();
Response.Write(Convert.ToString((bar.Length * 16 /8)) + " byte <br>");
Response.Write(Convert.ToString((bar2.Length * 16 / 8)) + " byte"); 

Şeklinde yapabiliriz. Char veri tipi 16 bit yani ve bir byte 8 bittir. Bu denklem yardımıyla istediğimiz string türününün kaç byte olduğunu hesaplayabiliriz.  

  Aşağıdaki tabloda c# dilindeki değişkenlere ait türleri ve hangi türlerin hangi tipe ait olduğuna dair bilgi bulabilirsiniz.

     

Tip

Tür

İsim

Boyut(bit)

Açıklama

Değer Sbyte Signed byte 8 İşaretli byte
Değer Byte Unsigned Byte 8 İşaretsiz byte
Değer Short 16bit Signed Integer 16 İşaretli tam sayı(16bit)
Değer ushort 16bit UnSigned Integer 16 İşaretsiz tam sayı(16bit)
Değer İnt 32 bit signed Integer 32 İşaretli tam sayı 32 bit
Değer uint 32 bit unsigned Integer 32 İşaretsiz tam sayı 32 bit
Değer Long 64 bit signed Integer 64 İşretli 64 bit tam sayı
Değer ulong 64 bit unsigned Integer 64 İşretsiz 64 bit tam sayı
Değer Float 32 bit ondalıklı 32 32 bit İşaretli ondalıklı l sayı (7 haneli)
Değer Double 64 bit ondalıklı 64 64 bitİşaretli ondalıklı sayı (15-16 haneli)
Değer Decimal 128 bit real 128 128 bit İşaretli ondalıklı sayı (virgülden sonra 28 hane duyarlı)
Değer Bool Boolean 8 True yada false
Değer Char Karakter 16 Unicode karakterler
Referans String Karakter kümesi Belirsiz Text içerikli veriler.
Referans Object Tür bağımsız ana nesne Belirsiz Tüm türlerin üretildiği Tür bağımsız değişkendir.
 

C#

C# 3.0 Test Sürüşü - 1 (Variable - Implicity typed local variables)

by Yasin Sirkecili 13. December 2007

C# 3.0 da artık tür belirtmeksizin değişken tanımlamamıza olanak sağlayan yenilikler mevcut. Ancak bu değişkenlerin özelliği object değişkenler gibi referans tipli değişkenler değildir. Bunun yerine değeri atanırken tipinin belirkendiği değişkenlerdir. Bu özelliği JavaScriptten hatırlayacaksınız.

örneğin:

var deger = "yasin"; // string tipinde deger adında bir değişken yaratmış oldunuz.
var deger2 = 4 // integer tipinde deger2 adında bir değişken tanımlamış oldunuz.

gördüğünüz gibi var adıyla değişkenin valuesune bakarak değişkene değer aktarılabiliryor. Aslında bu tarz basit bir eylemi bi kaç ay önce bir projede db ile yaptığımız etkileşimler esnasında ihtiyaç duyup yazmıştım. Meğer kolayı varmış :)  (Radyonun resimlisi benim aklıma gelmişti sendromu) :) herneyse konumuza dönecek olursak var değişken tanımlamasında yukarıda da gödüğünüz üzere değişkenin değerinin türüne bakaraktan değişkenin tipini belirliyor yani eğer değişkene değer atamazsanız

örneğin;

var yasin; // değeri olmadığını için türünü belirleyemeyecek ve hata verecektir.

bununla beraber eğer değişkene null değerini atarsanız yine aynı hatayı verecektir.

var yasin2 = null // HATA !!


Bir noktaya daha değinmek gerekirse

var nesne 123 // nesne değişkenim şuanda integer tipinde;
nesne = "yasin sirkecili"; // HATA !! nesne değişkenimiz oluşturulurken integer tipinde olduğundan tekrar değer atayıp tipini değiştiremezsiniz.




C#

C# & Fibonacci

by Yasin Sirkecili 6. November 2007

Forumda sorulan bir soru için yazdığım cevap: Fibonacci dizisini c# ile nasıl kısayoldan bulunabileceği...

ArrayList arys = new ArrayList();
arys.Add(1);
for (int
i = 1; i <= arys.Count; i++)
{
if
(arys.Count < 2)
{
arys.Add(1);
}
else
{
arys.Add(Convert.ToInt32(arys[i - 1]) + Convert
.ToInt32(arys[i - 2]));
if
(arys.Count == 20)
{
listBox1.Items.AddRange(arys.ToArray());
break
;
}
}
}

1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4184,6765,10949,

ben ilk 20 terimini buldum siz isterseniz çoğaltabilirsiniz.

C#

SMTP Authentication ve System.Net.Mail Class

by Yasin Sirkecili 13. October 2007

SMTP Authentication gerektirmeyen mail serverlarda çoğumuz smtp authentication bilgisi yazmadan maillerimizi gönderiyoruz Tabiki bu yöntemin kullanıldığı sunucular genel olarak spam mail göndermeye uygun diyebiliriz. Standart olarak birçoğumuz smtp serverımızı mail.alanadi.com şeklinde tanımladığımızdan eğer SMTP Authentication gerektirmeden mail gönderilmesine olanak sağlarsak herkesin bizim serverımız üzerinden mail göndermesi mümkün hale gelir. Bu bir güvenlik açığımıdır sorusuna evet diyebilirim çünkü milyonlarca mail gönderen toplu mail gönderme programları mevcut. Peki SMTP Authentication gerektiren sunucularda nasıl mail göndeririz ona değinelim.

ilk olarak işimizi kısayoldan halletmek için web.config dosyamıza system.net nodeunun altındaki mailSettings nodeunda gerekli ayarlarımızı yapalım.

<system.net>
<
mailSettings
>
<
smtp from="info@alanadi.com"
>
<
network port="25" host="mail.alanadi.com" userName="info@alanadi.com" password="sifrem" defaultCredentials="true"
/>
</
smtp
>
</
mailSettings
>
</
system.net>

bu aşamadan sonra kodlarımıza bakalım.

SmtpClient smtpserver = new SmtpClient();
MailAddress mSender = new MailAddress("info@alanadi.com"
);
MailAddress mTo = new MailAddress("to@alanadi.com"
);
MailMessage newMail = new MailMessage
(mSender, mTo);
smtpserver.Send(newMail);

gördüğünüz gibi bu aşamadan sonra info@alanadi.com adresi ile gönderdiğimiz tüm maillerde mailSettings nodeunda belirttiğimiz SMTP Authentication bilgileri geçerli olacaktır.

Peki ya Web.Config kullanmadan nasıl çözerim bu işi derseniz.

SmtpClient smtpserver = new SmtpClient();
MailAddress mSender = new MailAddress("info@alanadi.com");
MailAddress mTo = new MailAddress("to@alanadi.com");
MailMessage newMail = new MailMessage(mSender, mTo);
System.Net.
NetworkCredential auth = new System.Net.NetworkCredential("info@alanadi.com", "sifrem");
smtpserver.UseDefaultCredentials =
false;
smtpserver.Credentials = auth;
smtpserver.Send(newMail);

yönetiminide kullanabilirsiniz.

Hakkımda

Name of author Yasin Sirkecili
Asp.Net Developer

Takvim

<<  October 2008  >>
MoTuWeThFrSaSu
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

Büyük Takvimde Göster

Bağlantılar

    ©2008

    Sign in