İçiçe(nested) Lİnq Sorgu örneği

İçiçe LinQ Sorgusu orneği

SELECT c, (SELECT c, (SELECT c FROM AdventureWorksModel.Vendor AS c  ) As Inner2 
    FROM AdventureWorksModel.JobCandidate AS c  ) As Inner1 
    FROM AdventureWorksModel.EmployeeDepartmentHistory AS c

Params Deyimini Kullanmak1,

Bazen sayısı belli olmayan(run time da belli olacak) parametreleri bir yonteme göndermek isteyebilrisiniz.

 

class Program
    {
        static void Main(string[] args)
        {
            dene d = new dene();
            Console.WriteLine(d.Topla(3, 4, 4));
            Console.WriteLine(d.Topla(3,4,5,6,7,4));        }
    }
    class dene
    {
        public int Topla(params int[] sayilar)
        {
            int topla=0;
            foreach (int item in sayilar)
	        {
                topla += item;
	        }
            return topla;
        }
    }

Ayrıca params kullanmadan bazı teknikler kullanabilirsiniz. İş parçacıkları oluşturmak, kodun okunurluğu ve esnekliği açısından uygun olacaktır.

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            dene d = new dene("ali");
            d.yaz();
            Console.WriteLine(d.Topla(3, 4, 4));
            Console.WriteLine(d.Topla(3,4,5,6,7,4));        }
    }
    class dene
    {
        dene()
        {

        }
        string dd;
        public dene(string deneme)
        {
            dd=deneme;
        }
        public void yaz()
        {
            Console.WriteLine("yaz" +dd);
        }
        public int Topla(params int[] sayilar)
        {
            int topla=0;
            foreach (int item in sayilar)
	        {
                topla += item;
	        }
            return topla;
        }
    }
    class Matematik
    {
        public Matematik()
        {

        }
        static int pi = 4;
        public static double Toplam(double x, double y)
        {
            return x + y;
        }


        //Params deyimini kullanmadan bazı yontemlerimizi genişletebilirsiniz.
        public static double Toplam(double x, double y, double z)
        {
            return (Toplam(x,y))+z;
        }
        public double Toplamlar(int ustSinir, double x, double y)
        {
            double sonuc = 0;
            for (int i = 0; i < ustSinir; i++)
                sonuc += Toplam(x, y);
            return sonuc;
        }
    }
}

EF CodeFirst TPH TPS kullanımı

Merhaba Arkadaşlar Entitiy Framewrok de Code First yaklaşımında kullandığım TPH ve TPS kullanımına ornek olarak yaptığım ornek yazılım kodlarını cereceğim. Gerekli açıklamaları sonra yazacağım..

 

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

namespace TPH
{
    public class Program
    {
        static void Main(string[] args)
        {
            using (var context=new TPHC())
            {
                //Product product = new Product { Name = "Elma", Title = "Balık1" };
                //context.Products.Add(product);


                //Gozluk gozluk = new Gozluk { Name = "RyBan", Number = 4, Title = "Gozluk Başlık" };
                //context.Gozlukler.Add(gozluk);


                //Cerceve cerceve = new Cerceve
                //{
                //    Name = "cerceve",
                //    Title = "Cerceveler Başiıl",
                //    Index = "İndexi",
                //    CerceveNumber = 4,
                //    Number = 4,
                //    Category = new Category { Name = "İpli" }
                //};
                //context.Cerceveler.Add(cerceve);
                //context.SaveChanges();

                //var query = from b in context.Products
                //            orderby b.Name
                //            select b;

                //Gozluk gozluk1 = context.Gozlukler.FirstOrDefault(p => p.Id == 3);
                // //Hem Gozluk hemde cercevedeli gozluk ozelliklerini siler.
                //context.Gozlukler.Remove(gozluk1);
                //context.SaveChanges();


                //Console.WriteLine("All blogs in the database:");
                //foreach (var item in query)
                //{
                //    Console.WriteLine(item.Name);
                //}
            //sil();
                 #if true
            
                //BaseClassAbstract temel = new BaseClassAbstract();
                //temel.Number = 45;    
                #endif


            }

    
        }

      private static void sil()
       {
             using (var context=new TPHC())
            {

                Cerceve cerceve = context.Cerceveler.FirstOrDefault(p => p.Id == 4);
                context.Cerceveler.Remove(cerceve);
                context.SaveChanges();
             }
        }
    }
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Title { get; set; }
    }
    public class Gozluk:Product
    {
        public string Index { get; set; }
        public int Number { get; set; }
    }
    public class Cerceve:Gozluk
    {
        public int CerceveNumber { get; set; }
        public  virtual Category Category { get; set; }
    }
    public class Category
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public virtual ICollection<Cerceve> Cerceveler {get;set;}
    }

    public abstract  class BaseClassAbstract
    {
        public int Id { get; set; }
        public int Number { get; set; }

        public BaseClassAbstract()
        {
            // TODO: Complete member initialization
        }
    }

    public class KalitsalOlan : BaseClassAbstract
    {
        public string Name { get; set; }
        public string SurName { get; set; }
    }

    public class TPHC : DbContext
    {
        public DbSet<Product> Products { get; set; }
        public DbSet<Gozluk> Gozlukler { get; set; }
        public DbSet<Cerceve> Cerceveler { get; set; }
        public DbSet<BaseClassAbstract> BaseClasAbstractlar { get; set; }
        public DbSet<KalitsalOlan> KalitsalOlanlar { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Gozluk>().ToTable("Gozlukler");
            modelBuilder.Entity<Cerceve>().ToTable("Cerceveler");
            modelBuilder.Entity<KalitsalOlan>().ToTable("KalitsalOlanlar");
            base.OnModelCreating(modelBuilder);
        }
    }

}

codeFirst.rar (2,33 mb)

 Maskot resmimiz..

Arabirimler(interface)-1

ARABİRİM(INTERFACE)

Bir sınıfdan kalıtım almak çok avantajlıdır. Nevarki c# sadece bir sınıfdan kalıtım alabilir. C++ dinde ise birde fazla birden fazla sınıfdan kalıtım alanabilniyordu. Birden fazla sınıftan kalıtım alınabilir, ama bu kodu yonetmek sıkıntı yaratabilir. Bu yüzden c# da bir sınıfdan kaltım alabilir, fakat bunun yanında  birden fazla arabirimden kalıtım alma özelliği geldi. Boylece arabirimler doğmuş oldu. Aslında arabirimdenler üzerinde yazaılacak ve anlatılacak o kadar çok şey varki, bunu yeri geldiğinde anlatmak daha güzel olacak. Arabirimler, "I" (Interface) harfi ile baslaması zorunlu olmasada makbuldür. Bizim kod okunurluğu açısından bu önemlidir.

Yazım Şekli

Interface IArabirimAdi
{
//arabirim üyeleri(interface members)
}

Arabirim üyeleri  Methods(Method), Properties(Özellik), Indexers(indexleyici) ,Events(Olay) olabilir ve arabirimler kod içermez, sadece  tanımlama(Declare)  içerirler.

Örnek 1.

interface IAyak
    {
        int Sayisi { get; set; }     //özellik(properties)
        void Yurur();                  //method
    }


Örnek 2.

interface IRecord
{
    int Id { get; set; }
    string Name{ get; set; }
    bool Load();
    bool Save();
    bool Delete();
}

Bu interface baktığımızda, zaten içinde kod olmayan bir sınıf yazmanın anlamsız olduğunu düşünürüz. Ama biraz daha derin düşünürsek, programı birden fazla kişi yada grup yazıyor olsun. Diğer sınıfları yazacak kişilere, sınıflarının bu arayüzü uygulamasını istiyoruz. Böylece onların yazacakları sınıfta Id, Name gibi propertylerin ve load, save gibi metodların olacağından emin oluyoruz. Bir anlamda classlara bir standart getirmiş oluyoruz.

İnterface iki şekilde implement(uygulanır) edilebiliir. Kapalı ve Açık(explicitly).  Aşağıdaki örnekde Kitap sınıfı kapalı,  Defter sınıfı açık bir şekilde implement edilmiştir. Açık bir şekilde belirtmenin avantajı aynı isimli üyeye sahibi iki arabirim olabilir.  Bu iki arabirimden kalıtım alan bir sınıfda çakışma meydana geleceği için açık bir şekilde implemet etmek gerekir. Aşağıdaki örnekte Yazdir() yöntemi her iki arabirimde vardır. Defter sınıfında Yazdir() yöntemleri çakışmasın diye açık bir şekilde implement edilmiştir. Açık bir şeklde yazmak için interface isimi.Üye adı  şeklinde yazılır. void IBelge.Yazdir() gibidir.

   class Program
    {
        static void Main(string[] args)
        {
        }
   }
interface IBelge { void Yazdir(); } interface Inot { string sahibi(); void Yazdir(); } class Kitap :IBelge { public void Yazdir() { //kod yazılacak } } class Defter : IBelge,Inot { void IBelge.Yazdir() { //belge yazma kodları //açık bir impelement yapılmış. } string Inot.sahibi() { //açık bir impelement yapılmış. return ""; } void Inot.Yazdir() { //açık bir impelement yapılmış. } }
Biz Editörü kullnarak bir bir arabirimi implement edebiliriz. Açık ve kapalı.

 

 Aşağıda açık bir şekilde implement ediliyor.

 

 

 

 

Arabirim uygulanan bir sınıfda, arabirim üyeleri olması zorunludur. Aksi bir durumumde prohe derlenmez.

3 parağram yani yarım sayfa boş bırak

 Açık arabirim kullanmanın avantajları

Bir arabirimi açık bir şekilde uygulamak gereksiz gibi görülebilir fakat daha temi, bakımı daha kolay ve önceden tahmin edilebilir(garanti altına alındığı için) daha çok kod yazmanıza yardımcı olan pek çok avantajı vardır.

 Arabirim adını açık olarak belirmeden bir yöntem uygulayabilirsiniz fakat bu, uygulamanın davranış biçimlerinde bazı farklılıklar gösterebilir. Öreneğin açıkça arabirim uygulamasını kullanarak tanımlanmış bir yöntem sanal olarak bildirilemez, ancak arabirim adını ihmal etmek bu davranışı izin verir.

 Aynı anda dönüş türünde ve parametrelerde yöntemler içeren birden fazla arabirim mümkündür. Bir sınıf, ortak declare edilmiş yöntemlerle birden fazla arabirim uygularsa, yöntem uygulamarı arasındaji belirsizliği gidermek için açık olarak uygulamasını kulalanabilirsiniz. Açık olarak arabirim uygulaması, bir sınıfdaki, bir sınıfdaki yöntemin hangi arabirime ait olduğunu tanımlar. Ayrıca her arabirim için yöntemler ortak olarak erişilebilir fakat sadece arabirimin kendisi üzerinden erişilebilir.

 

 

 

Açık Şekilde.

 

Özellikleri Anlama3(properties)

Senaryomuz gereği bir doğrunun uzunluğu bulan bir program yazacağız. Bu doğrunun ANoktasi ve BNoktasi isimli özellikleri olacak ve bu özelliklere değer aktarımı yapacağız. Daha sonrada bu Dogru sınıfının IkiNoktaArasiniBul() isimli bir yöntem yazacağız. Bir doğrunun uzunluğunu bulmak için kordinat düzleminde bu doğruyu çiziyoruz. Problemin matematiksel çözümünü buradan inceleyebilirsiniz.

 

 Programımız için aşağıdaki gibi bir form hazırlayalım..

Öncelikle küçük değerleri tutan bir class yerine Struct(Yapı) kullanmak daha avantajlı ve hızlı olduğunu hatırlatmak isterim. Yapıların ilk değerleri 0,  "" gibi ilk değerleri olması garanti altındadır. Tıpkı int a; tanımladığımızda anın ilk değeri 0 olması gibi. Enum, struct, double, int gibi önceden tanımlı tipler değer türüdür. String tipinin referans(başvuru) türü olduğunu hatırlayalım..

Point isimli yapımızı oluşturalım...

struct Point  //değer türlerinin başlangıç değerlerinin olması garanti altındadır.
    {  
        public int x, y;
        public Point(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    }

Daha sonra Dogru classımızı oluşturuyoruz. Özellik oluşturmanın bir yöntemide Sınıfımız üyesi üzerinde sağ tuşa tıklayıp, refactor, Encaptulation Filed  tıklayarak oluşturmaktır. Diğer bir deyişle bir alanı özeliklik kullanarak kapsülleme işlemi yapmaktır.

class Dogru
    {
        Point aNoktasi;
        Point bNoktasi;

        internal Point BNoktasi
        {
            get { return bNoktasi; }
            set { bNoktasi = value; }
        }

        internal Point ANoktasi
        {
            get { return aNoktasi; }
            set { aNoktasi = value; }
        }

        public double IkiNoktaArasiBul()
        {
            double sonuc = Math.Sqrt(((aNoktasi.x - bNoktasi.x) * (aNoktasi.x - bNoktasi.x)) + (aNoktasi.y - bNoktasi.y) * (aNoktasi.y - bNoktasi.y));
            return sonuc;
        }
    }

Hesapla butonunun click olayını işleyelim..Butonun üzerinde çift tıklayarak gerekli kodları yazalım...

 

private void btnHesapla_Click(object sender, EventArgs e)
        {
            int ax = Convert.ToInt32(tbAx.Text);
            int ay = Convert.ToInt32(tbAy.Text);
            int bx = Convert.ToInt32(tbBx.Text);
            int by = Convert.ToInt32(tbBy.Text);
            Point  A = new Point(ax, ay);
            Point  B = new Point(bx, by);
            Dogru dogrum = new Dogru();
            dogrum.ANoktasi = A; //ANoktasi isimli Özelliğini değer ataması yaptım..
            dogrum.BNoktasi = B;
            double sonuc = dogrum.IkiNoktaArasiBul();
            lblSonuc.Text = sonuc.ToString();

        }

Projemizi bu linkden indirebilirsiniz. 

ozellik5.rar (40,71 kb)

Bir sonraki yazıda görüşmek üzere. Esenlikle kalın..

 

Attribute Hazırlama

Merhaba Arkadaşlar,

Bundan 2-3 sene önce, yani yazılım projelerine el atmadan, EntityFrameworkCodeFirst hakkında bilgi sahibi olmadan önce, Ömer Faruk Taşkın hocamla veritabanı DDL sql tümcecikleri oluşturan classlar hakkında konuşurduk. Ben hep veritablosuna karşılık bir class(POCO) olmasını gerektiğini hayal ederdim(ORM), vakit olsa boyle bir namespace yazılabilir diye düşünürdüm. 

Yakın geçmişte anladım ki, teknoloji çok hızlı ilerlemiş. Zaten bu ORM araçları vasıtasıyla oluyormuş.  Microsoft un bununla ilgili bir çözüm üretmiş. Şimdi verirlerle oynamak ASP.NET, WCF,veya windows formlarında EnrityFrameworkü kullanarak herşeyi yapabiliyorun. İster modelden, ister veri tabanından, isterseniz POCO(Plain Old CLR Objects) classlar giderek bir model(edmx) hazırlayabiliryorsunuz. Neyse ben lafı uzatmak istemiyorum. Ben aşağıdaki code yapısıyla POCO classlar oluşturmaya çalıştım. Bu poco classa göre yazılım SQL tümcesi üretiyor ve tablo yapısını veri tabanında oluşturmakta. Bazı yerleri karışık oldu, bunu kabul ediyorum.. Kriterleri azaltığım halde, minimum bu kadar yazabildim. Her entity tipinin bir niteliğin olması zorunlu ve string veya int titpinden olduğu kabul edilmiştir, yoksa kod daha da uzayacaktı.

Tabii burada asıl anlatmak istedeğim konu Nitelik(Attribute) hazırlama ve kullanma..

Zaman buldukça bu kodları yazım sırasına göre düzenleyeceğim. açıklama satırlarını aradan çıkartıp daha anlaşılabilir yapacağım..

using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Entity;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;


namespace NitelikHazirlama
{
    class Program
    {
        static void Main(string[] args)
        {
            //aslında static de yapabiliriz diye düşünebilirsiniz. Fakat bir nitelik yazıyorsanız yazdığınız sınıfın başka bir sınıfa kalıt vermemesi gerekir.
            //Bu run time hatalarına sebeb olabilir. çünkü niteli��inin içeriğinin bilmiyorsunuz. Sealed (mühürlü) yaptığım bir sınıfıda static yapamam. Zaten derleyici buna izin vermez.
            olusturTablo ol = new olusturTablo(typeof(User));
            ol.create();

            //Nuget Concole den  Install-Package EntityFramework -Version 5.0.0 yazarak Entity fraewrok 5.0 yüklüyorum..="Data Source=|DataDirectory|\aspnet.sdf"
            
  //<connectionStrings>
  // <add name="DefaultConnection" connectionString="Data Source=|DataDirectory|\veritabani.sdf" providerName="System.Data.SqlServerCe.4.0" />   
  //</connectionStrings>
            Database db=null;
            //db.Create();
            db.ExecuteSqlCommand("crete table kul", 0);
         
            //Type tip;
            //tip = typeof(User);
            //foreach (TabloAdiAttribute ta in (TabloAdiAttribute[])tip.GetCustomAttributes(typeof(TabloAdiAttribute), false))
            //{
            //    Console.WriteLine(ta);
            //}
            //StringBuilder createTableQueryString = new StringBuilder();
            //GerekliAttribute gA = ((GerekliAttribute[])(tip.GetProperties()[1]).GetCustomAttributes(typeof(GerekliAttribute), false))[0];


            //foreach (PropertyInfo item in tip.GetProperties())
            //{
            //    GerekliAttribute gA = ((GerekliAttribute[])item.GetCustomAttributes(typeof(GerekliAttribute), false))[0];
            //    bool gereklimi = gA.Gereklimi;
            //    int AlanLenght = gA.Max;
            //    Console.WriteLine(item);
            //    createTableQueryString.Append(item.Name);
            //    createTableQueryString.Append(item.Name);

            //}
            //Console.WriteLine(createTableQueryString);
            //Console.WriteLine(gA );

            
        }
    }

    sealed  class olusturTablo
    {

        public olusturTablo(Type tip)
        {
            this.tip = tip;
        }
       Type tip;
       public void create()
       {   
           TabloAdiAttribute ta=((TabloAdiAttribute[])tip.GetCustomAttributes(typeof(TabloAdiAttribute),false))[0];
           //burada tip bir çok attribute uygulabibileceği için ve geri dönüş değeri attribute oldugundan tipin
           //TabloAdiAttrubete sini cast yaparak gelen dizi elemanın 0 indexli değer aldım. Başka bir attribute olmadığı için 0
           string tabloAdi = ta.TabloAdi;
          
           StringBuilder createTableQueryString = new StringBuilder();
           //http://msdn.microsoft.com/en-us/library/system.reflection.aspx System.Reflection isim alanını projemize katıyoruz.
           //ayrıca referans etmemize gerek yok, zaten mscorb runtime da.

           // artık aşağıda sql tümcesi biraz karışık oldı ve acemice oldu ama ne yapalım.. 
           // Aşağıda kontroller her entity tipinin bit niteliğin olması zorunlu ve string ve int olarak kabul edilmiştir..
           // yoksa kod daha da uzayacaktı..
            createTableQueryString.Append("create table ");
            createTableQueryString.Append(tabloAdi +",");
           //tipimizin property memberlarını reflection yontemi ile dongu içinde alıp, bu propety lerin attributelerini elde ediyoruz.
           foreach (PropertyInfo item in tip.GetProperties())
           {
               GerekliAttribute gA = ((GerekliAttribute[])item.GetCustomAttributes(typeof(GerekliAttribute), false))[0];

                     createTableQueryString.Append(" " + item.Name);
                   //object alantipi = item.GetValue(this, null);
                   if ((item.PropertyType.Name == "String") && (gA.Max != 0))
                       createTableQueryString.Append(" nvarchar(" + gA.Max.ToString() + ")");
                   else if ((item.PropertyType.Name == "String") && (gA.Max != 0))
                       createTableQueryString.Append(" nvarchar()");
                   else
                       createTableQueryString.Append(" int");
                   if (!gA.Gereklimi)
                       createTableQueryString.Append(" NOT NULL");
                   createTableQueryString.Append(",");
           }
           createTableQueryString.Remove(createTableQueryString.Length - 1, 1);  //son virgülü kaldırdım..


           Console.WriteLine(createTableQueryString);

       } 
    }

    [TabloAdi("Kullanici")]
    class User
    {
        [Gerekli()]
        public int id { get; set; }
        
        [Gerekli()]
        public string Ad { get; set; }

        [Gerekli(false)]
        public string Soyad { get; set; }

        [Gerekli(false, 23)]
        public string BabaAdi { get; set; }
    }

    //Attribute' lerin amacı, belkide en önemli özelliği, üretilen assembly içerisinde yer alan tip ve üyelere ekstra bilgiler katabilmeleridir.
    //Bir başka deyişle metadata içerisine ilave bilgiler eklenebilmesini sağlamaktadır. Attribute lerden türemek zordundadır
    //.Ben Attribute ve çift taba basarak hazırlamak istedim. Senaryo gereği tablo adını ve gerekli nitelik hazırlayan bir
    //sql tümcesi hazırlamak için kullanacağım. TabloAdiAttribute class' a gerekli lik olanını ise metoda uygulamak istiyorum..
    //Attributeler reflection (yansıma) dediğimiz olayın ta kendisini kullanırlar. Yanii kendi kodlarını assemly ye eklerler. Tabii ki run time da(var oluş amacı).

    [AttributeUsage(AttributeTargets.Class, Inherited =  false, AllowMultiple = true)]
    sealed class TabloAdiAttribute : Attribute
    {
        // See the attribute guidelines at 
        //  http://go.microsoft.com/fwlink/?LinkId=85236
        readonly string tabloAdi;
        static int sayisi=0;

        public TabloAdiAttribute()
            : this("Adsiz"+sayisi.ToString())
        {
            sayisi++;
        }


        public TabloAdiAttribute(string tabloAdi)
        {
            this.tabloAdi = tabloAdi;
            // TODO: Implement code here
            //throw new NotImplementedException();
        }

         public string TabloAdi
        {
            get { return tabloAdi; }
        }
        public int NamedInt { get; set; }
    }


    //method için.
    [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
    sealed class GerekliAttribute : Attribute
    {
        readonly bool gereklimi;
        readonly int max;

        public int Max
        {
            get { return max; }
        } 

        public GerekliAttribute() 
            :this(true)
        {
            //varsayılan olarak true yapıyorum. 
            //Tıpkı entiyFrameWrok de kullanılan Convention Kurallarında olduğu gibi.
            // ben de bir nevi convention rule yaptım yani :)
            // buradan covention hakkıında bir fikir sahibi olabilirisniz. http://blogs.msdn.com/b/efdesign/archive/2010/06/01/conventions-for-code-first.aspx
            // Buradan ise Entity bir tip Yani POCO (Plain Old CLR Objects) claslarımızı oluştururken Conventions Rules classlarını inceleyebilirisiniz.
            //http://msdn.microsoft.com/en-us/library/gg696316(v=vs.103).aspx
            //

        }
        public bool Gereklimi
        {
            get { return gereklimi; }
        } 

        // This is a positional argument
        public GerekliAttribute(bool gereklimiAcaba)
            :this(gereklimiAcaba,255)
        {
            //this.gereklimi = gereklimiAcaba;
            // TODO: Implement code here
            //throw new NotImplementedException();
        }

        public GerekliAttribute(bool gereklimiAcaba, int max)
        {
            this.gereklimi = gereklimiAcaba;
            this.max= max;
            // TODO: Implement code here
            //throw new NotImplementedException();
        }
              //Burası argument vermek için.
        public int NamedInt { get; set; }
    }
}



 

 

Kolleksiyonlar (ArrayList, Stack, Queue, Hastable)

ArrayList

using System;
using System.Collections;
// ArrayList Kullanımı
namespace arrayListexample
{
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList degiskenim = new ArrayList();
            degiskenim.Add(7.78M);
            degiskenim.Add("Gönül");
            degiskenim.Add("feriştah adıgüzel");
            degiskenim.Add(8); //ekler
            //degiskenim.Remove(8);//koleysiyondan çıkarır.
            //degiskenim.Clear(); //kolleksiyonu boşaltır.
            yazdir(degiskenim);
        }
        private static void yazdir(ArrayList degiskenim)
        {
            if (degiskenim.Contains("Gönül"))
                Console.WriteLine("    hehehehe he yakaladım seni, gönül var");
            foreach (var item in degiskenim)
            {
                Console.WriteLine(item.ToString());
            }
        }
    }
}

Stack Tipi kolleksiyonlar

using System;
using System.Collections;

namespace yiginTipiKolleksiyon
{
    class Program
    {
        static void Main(string[] args)
        {
            Stack tabakSirasi = new Stack();
            tabakSirasi.Push("Hicriye");
            tabakSirasi.Push("Rukiye");
            tabakSirasi.Push("feriştah");
            Console.WriteLine("tabak gelsin: {0}", tabakSirasi.Pop());
            Console.WriteLine("tabaklar");
            Console.WriteLine("---------------------");
            foreach (var item in tabakSirasi)
            {
                Console.WriteLine(item);
            }
        }
    }
}

Queue ( Kuyruk) Tipi Kolleksiyon

using System;
using System.Collections;


namespace kuyrukTipikolleksiyon
{
    class Program
    {
        static void Main(string[] args)
        {
            Queue kuyruklu = new Queue();
            kuyruklu.Enqueue("Hicriye");
            kuyruklu.Enqueue("Rukiye");
            kuyruklu.Enqueue("feriştah");
            Console.WriteLine("kurukdaki gelsin: {0}",kuyruklu.Dequeue());
            Console.WriteLine("kuyruktakiler");
            Console.WriteLine("---------------------");
            foreach (var item in kuyruklu)
            {
                Console.WriteLine(item);
            }
           
            //ikinci bir listeleme şekli
            IEnumerator numaraliListem = kuyruklu.GetEnumerator();
            while (numaraliListem.MoveNext())
            {
                Console.WriteLine(numaraliListem.Current);
            }
        }
    }

}

x

x

 

Struct (Yapılar)

Yapı türleri (Struct) içersinde veri ve methodları olan bir nevi class' lara benzerler. Ama yapı olarak birbirinden çok farklı yapılara sahiptirler. Struct küçük veriler içerecek classlara struct yapısına mantıklı olacaktır.Struct türler değer türüdür, heap bölge tahsisi gerektirmez.  Struct yapısı, kullanıcı tanımlı kalıtımı desteklemez ve tüm struct yapıları dolaylı olarak object tipinden kalıtım alır.

Karmaşık sayılar ve koordinat sisteminde noktalar struct yapılarına iyi örneklerdir. Bir yapıda sınıf yerine struct kullanımı, bellek tahsis etmede ve programınızın performansında büyük farklılıklar yaratabilir.

struct Nokta

{

    public int x, y;

    public Nokta(int x, int y)

    {

        this.x = x;

        this.y = y;

    }

}

Burada sadece 1 nesne yaratılır – 1 adet dizi için – ve Nokta örnekleri dizi içerisinde saklanırlar.

Önemli: Struct yapısının performans açısından sağladığı faydayı “Her zaman struct kullanın” şeklinde algılamak yanlış olur. Tabi ki bazı senaryolarda struct yapısına bellek ayırmak ve bellekten almak daha az zaman alır fakat her struct ataması bilindiği gibi değer kopyalamasıdır (value copy). Bu her zaman referans kopyalamasından daha fazla zaman alır.

Sınıflarda, iki farklı değişken aynı nesneye referans gösterebilir ve bu şekilde bir değer üzerindeki işlemler aynı nesneyi referans eden diğer değişkeni etkileyebilir. Struct yapılarında, her değişken kendi verisinin kopyasını tutar ve bir değişkenin diğerini etkilemesi imkansızdır. Örneğin aşağıdaki kodu inceleyelim;

 

Nokta a = new Nokta(10, 10);

Nokta b = a;

a.x = 20;

Console.WriteLine(b.x);

Eğer buradaki Nokta örneği bir sınıf (class) ise, sonucumuz 20 olur çünkü a ve b aynı nesneye referans gösterirler. Eğer Nokta örneği bir struct ise, sonucumuz 10 olur çünkü ikinci satırdaki atama işlemi değer olarak a’daki değerleri b’ye kopyalar ve bu kopyalama 3. satırdaki a.x atamasını etkilemez.

Bu örnekte struct kullanımının 2 noktasının farkına vardır. Birincisi, tüm struct yapısını kopyalamak bir nesne referansını kopyalamaktan daha az verimli. Böylece atama yapma ve değer parametresi geçirme struct yapılarında referans tiplerine göre daha maliyetli olabilir. İkincisi, ref ve out parametreleri dışında, struct yapısına referans oluşturma imkansızdır. Aşağıdaki tablo tüm konuyu özetlemektedir.

Excell Çalışma Kitapları

 

Ornek 1.  İndirmek için tıklayın

Örnek 2. ornek2.xlsx (16,98 kb)

Örnek 3. piechartsetup.xlsx (27,91 kb)

 

 

 

Daha Fazla örnek dokumanlar için tıklayınız.

 

checked, unchecked ve is, as deyimleri

Bazı aritmatiksel veya mantıksal işlermler hata vermeyen ama sonucu yanlış olan işlemler olabiilir. Mesala bir int türü -214748648 ile -2147483647 arasındaki sayılırı tanımlayabiliriz. İki sayının toplamı bu değerleri aşarsa taşma meydana gelir, hata fırlatmaz faka sonuz yanlıştır. Bu gibi durumlara sonucun denetlenmesi ve hata fırlatması için checked deyimi kullanılır.

int ten = 10;
int i2 = 2147483647 + ten;
Console.WriteLine(i2);

Bu işlemin sonucu yanlış çıkacaktır. Bukodu checked kullanılarak güvenli hale getirelim.

// tek satırda
Console.WriteLine(checked(2147483647 + ten));

// veya blok olarak yazabiliriz.
checked
{
    int i3 = 2147483647 + ten;
    Console.WriteLine(i3);
}

unchecked deyimi ise kontrol edilmeden atama işlemleri yapar. Aslında hiçbir şey yazmadan atama işlemi yaparsak unchecked gibi işlem yapılır, buna ne gerek var diyebilirsiniz. Bunun cevabı aşağıdaki kod gizli. Güvenli bir alanda yok yere işlem maliyeti artmasın diye güvensiz bir bölge oluşturabilirsiniz.

checked
        { 
            // güvenli bölge
            unchecked
            { 
               //güvensz bölge
            }
            // güvenli bölge
        }

as öperatörü

Bu operatör dinamic tipler kullanırken çok kullanılanışlıdır, çünkü türünü bilmediğimiz bir çok tiple çalışır, değer atamaları yaparız.. Eğer tip uyuşmazlığı riski varsa, bu operatörü kullanarak exception alınmamasını sağlayabiliriz.

class Program
    {
        static void Main(string[] args)
        {
            object prog = new int();
 
            string s = prog as string;
 
            if (s == null)
            {
                Console.WriteLine("geçerli bir string girilmedi.");
            }
            else
            {
                Console.WriteLine("uygun bir tip ile atama yapıldı");
            }
        }
    }

İkinci bir örnegi msdn den vereceğim Bu sefer kalıtım almış iki tür var.

class csrefKeywordsOperators
   {
       class Base
       {
           public override string  ToString()
           {
	             return "Base";
           }
       }
       class Derived : Base 
       { }

       class Program
       {
           static void Main()
           {
               Derived d = new Derived();
               Base b = d as Base;
               if (b != null)
               {
                   Console.WriteLine(b.ToString());
               }
           }
       }
   }

Ekran çıktısı base olacaktır. Derived türü aslında Base türüründen türemiştir.

is operatörü

Bir alanın türünü o anda bilmek isteyebilriz.

 

 

using System;

namespace ConsoleApplication14
{
    class GuvenliKes
    {
        class Hayvan
        {
            public void Ye() { Console.WriteLine("yemeğimi yiyiyorum..."); }
            public override string ToString()
            {
                return "Ben bir hayvanım.";
            }
        }
        class Memeli : Hayvan { }
        class Maymun : Memeli { }

        class Yildiz { }

        static void Main()
        {
            GuvenliKes uygulamam = new GuvenliKes();

            Maymun g = new Maymun();
            uygulamam.IsKullan(g);


            uygulamam.AsKullan(g);


            Yildiz sn = new Yildiz();
            uygulamam.AsKullan(sn);


            int i = 5;
            uygulamam.AsIleNullKullan(i);


            double d = 9.78654;
            uygulamam.AsIleNullKullan(d);


            System.Console.WriteLine("çıkış içi tuşa bas.");
            System.Console.ReadKey();
        }

        void IsKullan(Hayvan a)
        {
            if (a is Memeli)
            {
                Memeli m = (Memeli)a;
                m.Ye();
            }
        }

        void AsKullan(object o)
        {
            Memeli m = o as Memeli;
            if (m != null)
            {
                Console.WriteLine(m.ToString());
            }
            else
            {
                Console.WriteLine("{0} hayvan değil.", o.GetType().Name);
            }
        }

        void AsIleNullKullan(System.ValueType val)
        {
            int? j = val as int?;
            if (j != null)
            {
                Console.WriteLine(j);
            }
            else
            {
                Console.WriteLine(val.ToString() + "Dönüştürülemedi.. ");
            }
        }
    }
}

 

x

 

 

 

 

The file '/Custom/Widgets/Calendar/widget.cshtml' does not exist.The file '/Custom/Widgets/Category list/widget.cshtml' does not exist.The file '/Custom/Widgets/Tag cloud/widget.cshtml' does not exist.The file '/Custom/Widgets/Page List/widget.cshtml' does not exist.The file '/Custom/Widgets/Month List/widget.cshtml' does not exist.