C# etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
C# etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

C# - Tarih Formatları ( DateTime.ToString() )

Tarih Formatları

0 MM/dd/yyyy 08/22/2006
1 dddd, dd MMMM yyyy Tuesday, 22 August 2006
2 dddd, dd MMMM yyyy HH:mm Tuesday, 22 August 2006 06:30
3 dddd, dd MMMM yyyy hh:mm tt Tuesday, 22 August 2006 06:30 AM
4 dddd, dd MMMM yyyy H:mm Tuesday, 22 August 2006 6:30
5 dddd, dd MMMM yyyy h:mm tt Tuesday, 22 August 2006 6:30 AM
6 dddd, dd MMMM yyyy HH:mm:ss Tuesday, 22 August 2006 06:30:07
7 MM/dd/yyyy HH:mm 08/22/2006 06:30
8 MM/dd/yyyy hh:mm tt 08/22/2006 06:30 AM
9 MM/dd/yyyy H:mm 08/22/2006 6:30
10 MM/dd/yyyy h:mm tt 08/22/2006 6:30 AM
10 MM/dd/yyyy h:mm tt 08/22/2006 6:30 AM
10 MM/dd/yyyy h:mm tt 08/22/2006 6:30 AM
11 MM/dd/yyyy HH:mm:ss 08/22/2006 06:30:07
12 MMMM dd August 22
13 MMMM dd August 22
14 yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK 2006-08-22T06:30:07.7199222-04:00
15 yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK 2006-08-22T06:30:07.7199222-04:00
16 ddd, dd MMM yyyy HH':'mm':'ss 'GMT' Tue, 22 Aug 2006 06:30:07 GMT
17 ddd, dd MMM yyyy HH':'mm':'ss 'GMT' Tue, 22 Aug 2006 06:30:07 GMT
18 yyyy'-'MM'-'dd'T'HH':'mm':'ss 2006-08-22T06:30:07
19 HH:mm 06:30
20 hh:mm tt 06:30 AM
21 H:mm 6:30
22 h:mm tt 6:30 AM
23 HH:mm:ss 06:30:07
24 yyyy'-'MM'-'dd HH':'mm':'ss'Z' 2006-08-22 06:30:07Z
25 dddd, dd MMMM yyyy HH:mm:ss Tuesday, 22 August 2006 06:30:07
26 yyyy MMMM 2006 August
27 yyyy MMMM 2006 August


DateTime.ToString ( 'd' ) :

0 MM/dd/yyyy 08/22/2006

DateTime.ToString ( 'D' ) :

0 dddd, dd MMMM yyyy Tuesday, 22 August 2006
DateTime.ToString ( 'f' ) :

0 dddd, dd MMMM yyyy HH:mm Tuesday, 22 August 2006 06:30
1 dddd, dd MMMM yyyy hh:mm tt Tuesday, 22 August 2006 06:30 AM
2 dddd, dd MMMM yyyy H:mm Tuesday, 22 August 2006 6:30
3 dddd, dd MMMM yyyy h:mm tt Tuesday, 22 August 2006 6:30 AM

DateTime.ToString ( 'F' ) :

0 dddd, dd MMMM yyyy HH:mm:ss Tuesday, 22 August 2006 06:30:07

DateTime.ToString ( 'g' ) :

0 MM/dd/yyyy HH:mm 08/22/2006 06:30
1 MM/dd/yyyy hh:mm tt 08/22/2006 06:30 AM
2 MM/dd/yyyy H:mm 08/22/2006 6:30
3 MM/dd/yyyy h:mm tt 08/22/2006 6:30 AM

DateTime.ToString ( 'G' ) :

0 MM/dd/yyyy HH:mm:ss 08/22/2006 06:30:07

DateTime.ToString ( 'm' ) :

0 MMMM dd August 22

DateTime.ToString ( 'r' ) :

0 ddd, dd MMM yyyy HH':'mm':'ss 'GMT' Tue, 22 Aug 2006 06:30:07 GMT

DateTime.ToString ( 's' ) :

0 yyyy'-'MM'-'dd'T'HH':'mm':'ss 2006-08-22T06:30:07

DateTime.ToString ( 'u' ) :

0 yyyy'-'MM'-'dd HH':'mm':'ss'Z' 2006-08-22 06:30:07Z

DateTime.ToString ( 'U' ) :

0 dddd, dd MMMM yyyy HH:mm:ss Tuesday, 22 August 2006 06:30:07

DateTime.ToString ( 'y' ) :

0 yyyy MMMM 2006 August

Newtonsoft.Json Kullanımı

Aşağıda size Newtonsoft.Json kullanarak bir json verisini nasıl okuyup işlem yapacağınızı anlatacağım.

Öncelikle Newtonsoft.Json ı kullanabilnek için referansımızı projemize dahil edelim.

Kütüphaneyi buradan indirebilirsiniz ya da benim aşağıdaki Visual Studio üzerinden  yüklediğim şekilde de yükleyebilirsiniz.

Bunun için Visual studio ortamında Package Manager Console u açıp aşağıdaki satırı çalıştıralım.


Default project kısmında hangi projemizde kullanacaksak o projeyi seçelim.


Newtonsoft.Json ı projemize dahil ettik.


Json verisini aşağıdaki şekilde bir url den okuyabiliriz.Ben burada daha önce elde edilmiş bir veri kullanacağım.Siz örnek kod parçasındaki gibi okuma yapabilirsiniz.

Örnek json verimiz aşağıdaki gibi olsun.


Jsonumuz array şeklinde döneceğimiz için bize bir class gerekli.Bunun için bir class oluşturalım.


Okuma işlemini gerçekleştirelim.


Projenin genel görünümü



QueryString Engelleme (Tamper Proof)

Default.aspx

Default.aspx.cs

HashHelper Class
Hesapla.aspx.cs

Örnek:
  • Default sayfamızı acalım ve text alanlara 4 ve 5 sayılarını girelim.

  • Hesapla Butonuna tıkladıktan sonra bizi Hesapla sayfasına yönlendirecek ve ekrana sayıların toplamı olan 9 sayısı yazacaktır.

  • Eğer acılan sayfa üzerinde querystring teki sayıları değiştirip sayfayı çağırırsak , bize hata verecektir.













İNTERNET BAĞLANTI KONTROLU

Tasarladığımız uygulamalarda bazı işlevlerin sorunsuz çalışabilmesi için uygulamanın çalıştığı cihazda internet bağlantısının olup olmadığı çalışma esnasında tespit edilmelidir. İnternet bağlantınsın mevcudiyeti tespit edildikten sonra internet erişimi gerektiren işlevler geçici olarak devre dışı bırakılabilir ve kullanıcı bir uyarı mesajı aracılığı ile durumdan haberdar edilebilir. Aksi takdirde uygulama çalışma esnasında hata verip sonlanabilir veyahut kullanıcı açısından sinir bozucu bazı durumlara sebebiyet verebilir.

 Aşagıda 5 farklı yolla internet bağlantısı kontrolunu anlatacağım.
Not: 4. ve 5. metod kullanımı daha yararlıdır.



Yukarıdaki örnekte ben Windows Internet API kullanımı ile internet bağlantısının olup olmadığını test ettim.

1- WebRequest Kullanımı
2- TcpSocket Kullanımı
3- PING Kullanımı
4- DNS Kullanımı
5- Windows Internet API Kullanımı






C# - GÖREV YÖNETİCİSİNİ ENGELLEME (TASK MANAGER DISABLE)

Kod kayıt defterindeki değeri değiştirerek görev yöneticisini engellemektedir. Ayrıca görev yönetici CTRL + ALT + DEL Tuşu ve başlat ikonuna sağ tıkladığımızda çıkan görev yöneticisini aç kısmını da engellemektedir.
Visual studio da form application project acalım.Form üzerinde iki adet buton koyalım.Disable butonu görev yöneticisini engellerken , Enable butonu ise görev yöneticisini aktif hale getirecektir.
Kod tarafınıda aşagıdakı gibi olusturalım.

DisableTask_Click Metodu

Şimdi aşağıdaki kodda regedit ile gerekli yola gidip DisableTaskMgr Yolundaki veriyi “1″ olarak değiştiriyoruz. Böylece görev yöneticisini engellemiş olacağız.

EnableTask_Click Metodu

Eğer yeniden görev yöneticisini aktif etmek istiyorsak “1″ olan değeri “0″ yapmamız gerek.





C# - ASP# - XML VERİ OKUMAK ve YAZMAK

Öncelikle bu işlemleri yapmak için XmlClass isimli bir class olusturarak başlıyorum. Kodlar üzerinde anlatırsam daha verimli olacaktır.

Burada class içerinde yer alan değişkenler tanımlanıyor daha sonra constructor olusturuluyor. Class içerisinde yer alan okuma yazma işlemini yapan metotlar bulunmaktadır.Bu metotları aşağıda açıklayacağım.

Xml Dosyası Olusturma ve Veri Yazma

XmlWrite metodu:

Kod calıstırıldıgında Urunler.xml adında bir dosya olusur ve içerigine verdigimiz bilgiler yazılır.


Var olan Xml Dosyasına Veri Yazma -(Write2 metodu kullanılmaktadır.)

XmlWrite2 Metodu:
Kod calıstırıldıgında var olan Urunler.xml dosyasına verdiğimiz bilgileri ekler.

Xml Dosyasından Veri Çekme(Dropdownliste Yükleme)

XmlRead Metodu
Kod çalıştırıldığında ekran görüntüsü:










C# - ERİŞİM DENETLEYİCİLERİ (ACCESS LEVELS)


private :

Private sadece kendi sınıfı tarafından erişilebilir. Varsayılan erişim denetleyici tipidir. Yani programımızın herhangi bir yerinde

int denemeAccess = 0;

gibi int tipinde denemeAccess değişkeni tanımlarsak başına private yazmasakta bu private olarak tanımlanır. Bu erişim genelede oluşturulan class,metod veya değişkenin değiştirilmesi program için hayatı önem taşıyan yerlerde kullanılır.

public :

Bir üye public olarak tanımlandığında, kod içerisinde herhangi bir yerden erişilebilir durumdadır. Bu erişim genelde oluşturulan class,metod veya değişkenin her yerden erişimi gerekiyorsa kullanılır.


internal :

Internal erişim denetleyicisi birden fazla uygulamanız olduğunda oldukça yararlıdır. Internal olarak tanımlanmış bir üye, aynı assembly içerisindeki tüm dosyalar tarafından bilinir ama farklı assembly içerisindeki dosyalar tarafından erişlemez. Diğer bir deyişle, internal üyeyi aynı program içerisinde kullanabilirsiniz ama bu üyeye farklı bir program içerisinden erişemezsiniz. Bir DLL hazırladınız. Bu DLL içerisinde bir değişkeni internal olarak tanımladığınızda, istediğiniz kadar sınıf ekleyin, bu sınıfların hepsi tarafından kullanılabilir. Ama bu DLL i başka bir uygulama içerisinde kullanırsanız, DLL içerisinde internal olarak tanımlanan üyeleri, diğer uygulama içerisinden göremezsiniz.

protected :

Protected üyeler, public ve private üyelerin bir birleşimi gibidir. Bir sınıf içerisinde üyeyi protected olarak tanımladığınızda, bu sınıftan türetilen sınıflar aynı üyeye erişebilir. Bu açıdan public üyelere benzer. Ama bu sınıftan türetilmeyen başka bir sınıf protected üyeye erişemez. Bu yönden de private üye gibi davranır.

protected internal :

Protected Internal üyelere kendinsini miras alan sınıflar erisir veya aynı assabmly içinden erisebilirler.

C# - TEXT DOSYASINA LOGLAMA


private void HataMesajlariniTextDosyayaYazma(List<Exceptions> dizi)
        {
            lock ("GokhanMentese")
            {
                try
                {
                    string klasor = @"C:\Deneme\HataMesajlari\";
                    string dosyaadi = DateTime.Now.ToString().Replace(".", "").Replace(":", "");

                    Impersonate impersonate = new Impersonate();
                    impersonate.impersonateValidUser("kullanıcıadi", "domain", "sifre");

                    #region Klasor Olusumu
                    if (!Directory.Exists(klasor))
                    {
                        Directory.CreateDirectory(klasor);
                    }
                    #endregion

                    string deg = dosyaadi + ".txt";
                    string filepath = klasor + deg;

                    FileInfo fileInfo = new FileInfo(filepath);
                 
                    string newLog = string.Empty;
                    using (StreamWriter dosya = fileInfo.CreateText())
                    {
                        newLog += "-------------------------------\r\n";
                        newLog += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n";
                     
                        dosya.WriteLine(newLog);
                        foreach (var item in dizi)
                        {
                            try
                            {
                                dosya.WriteLine(item.MesajinAlindigiYer);
                                dosya.WriteLine(item.HataMesaji);
                            }
                            catch (Exception)
                            {
                                dosya.Flush();
                                dosya.Dispose();
                                dosya.Close();
                            }
                        }
                        dosya.WriteLine("\r\n-------------------------------\r\n");
                    }
                    impersonate.undoImpersonation();
                 
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }

C# - IMPERSONATION KULLANIMI (Kod Aralıgında Yetki Alma)


Eger işlemi default kullanıcı bilgileri ile yapıyorsak , bazı işlemleri yaparken kullanıcı yetkisi yeterli olmayabilir.Bunun için yetki gereken işleri yapmadan önce yetkili birinin bilgilerini verir sonra yetkiyi tekrar alabiliriz.
Yukarida tanımladıgım işlem için once bir Impersonate adında class tanımlayalım ve içerigi asagıdakı gibi olsun.

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Security.Principal;
namespace SametPlugins
{
  public class Impersonate
  {
    public Impersonate()
    {
    }
    public const int LOGON32_LOGON_INTERACTIVE = 2;
    public const int LOGON32_PROVIDER_DEFAULT = 0;

    WindowsImpersonationContext impersonationContext;

    [DllImport("advapi32.dll")]
    public static extern int LogonUserA(String lpszUserName,
        String lpszDomain,
        String lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        ref IntPtr phToken);
    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int DuplicateToken(IntPtr hToken,
        int impersonationLevel,
        ref IntPtr hNewToken);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool RevertToSelf();

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern bool CloseHandle(IntPtr handle);

    public bool impersonateValidUser(String userName, String domain, String password)
    {
      WindowsIdentity tempWindowsIdentity;
      IntPtr token = IntPtr.Zero;
      IntPtr tokenDuplicate = IntPtr.Zero;

      if (RevertToSelf())
      {
        if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
            LOGON32_PROVIDER_DEFAULT, ref token) != 0)
        {
          if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
          {
            tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
            impersonationContext = tempWindowsIdentity.Impersonate();
            if (impersonationContext != null)
            {
              CloseHandle(token);
              CloseHandle(tokenDuplicate);
              return true;
            }
          }
        }
      }
      if (token != IntPtr.Zero)
        CloseHandle(token);
      if (tokenDuplicate != IntPtr.Zero)
        CloseHandle(tokenDuplicate);
      return false;
    }

    public void undoImpersonation()
    {
      impersonationContext.Undo();
    }
  }
}

Daha sonra kod tarafında bu classı kullanmak için,classtan nesne uretır ve impersonateValidUser metodunu kullanarak yetkiyi verir.İşlemimizi yaptıktan sonra yetkiyi almak için undoImpersonation metodunu cagırırız.

Örnek Kod:

//Kod

Impersonate impersonate=new Impersonate();
impersonate.impersonateValidUser("kullaniciadi","domainadi","sifre");

/*Yetki gerektiren kod bu araya yazılacak*/

impersonate.undoImpersonation();/*Tekrar default kullanıcıya geri donuldu*/


C# - DLL(Class Library) e Web Service Ekleme


Şimdi class project (dll) imize webservice nasıl eklenir onu gosterecegım.
Solution explorer da referencelar altında web reference secenegını goremeyınce web service referans veremiyoruz demeyin.Aşagıda nasıl referans vereceğimzi anlatacagım.

Öncelıkle projemızı acalım.File – New Project- Class Library 

 Daha sonra Solution Explorer ı acarak Add Service Reference a tıklayalım.
 Karsımıza asagıdaki ekran penceresi gelecektir.Bu ekrandan sol altta bulunan Advanced butonuna tıklayalım.
 Advanced butonuna tıkladıktan sonra acılan ekranda sol altta bulunan Add Web Reference butonunu tıklayalım.
 Cıkan ekrandan URL kısmından web servisimizin adresini vererek sayfaya git diyerek servisimizi bulup Web Reference Name alanından isim vererek Add Reference diyelim ve web servisimiz eklenmiş olacaktır
 

C# - SPLİT KULLANIMI



Belli bir sarta gore string imizi parcalara ayırır.Kullanımını asagıda kısa bir örnekle acıklayacagım.

Örnek:
string tarih = DateTime.Now.ToShortDateString(); // gunun tarihini alır. 14/12/2012
string[] tarihDizi = tarih.Split('/'); /*degiskenımı '/' karakterıne gore parcalara boler ve diziye atar.*/

/*Dizi içerisinde donup tarıhtekı '/' karakterını kaldırıp ,tarıhı yıl ay gun olarak yazdırma*/
for (int i = 0; i < tarihDizi.Length; i++) {
    fatura.dgTarih += tarihDizi[tarihDizi.Length - 1 - i];
}
/*Sonuc olarak fatura.dgTarih degiskenıne 20121214 degerı atanır.*/


C#- DATATABLE KULLANIMI

   DataTable dt = new DataTable("UrunTablosu");
/*UrunTablosu adında DataTable tanımlandı.*/

/*Şimdi datatable ın kolonlarını ve kolon tiplerini olusturalım*/

    dt.Columns.Add(new DataColumn("Product_ID", typeof(int)));
    dt.Columns.Add(new DataColumn("Product_Price", typeof(decimal)));
    dt.Columns.Add(new DataColumn("Index", typeof(int)));
    dt.Columns.Add(new DataColumn("Product_Type", typeof(string)));
    dt.Columns.Add(new DataColumn("Product_Name", typeof(string)));

   DataRow row = dt.NewRow();/*DataTable ın ilk satırını olusturalım.*/

  row[0] = 12345; /*1.satırdakı ilk kolona verilecek deger.*/
  row[1] = 32.50;/*1.satırdakı ikinci kolona verilecek deger.*/
  row[2] = 1;/*1.satırdakı üçüncü kolona verilecek deger.*/
  row[3] = Marketing;/*1.satırdakı dördüncü kolona verilecek deger.*/
  row[4] =urunAdi;/*1.satırdakı son kolona verilecek deger.*/
  
dt.Rows.Add(row);/*Olusturdugumuz satırı Datatable a ekliyoruz.*/

C# da Geriye Birden Fazla Parametre Döndürme


Normal değişken türleri kullanılarak geriye string , integer , double vs. türler geriye döndürülür.Biz şimdi hem integer hem de string değerin aynı anda bir metot tarafından geriye döndürülmesini göreceğiz.
(Kac parametre gönderilecegi bizim elimizdedir.)
Şimdi bu işi nasıl yapacagımıza gelelim.Bu olayı gerceklestırmek için bir class olusturacagımız.ve parametrelerımızı içine yazacagız.Bu classı kullanarak geriye verilerımızı gonderecegız.

Örnek Class
 public class Result
    {
        private int kisiYas;
        private string kisiAdi;/*field ismi üzerinde Ctrl +R+E tuslarına basılarak Property ler olusturulur.*/

        public string KisiAdi  
        {
            get { return kisiAdi; }
            set { kisiAdi= value; }
        }

        public int KisiYas
        {
            get { return kisiYas; }
            set { kisiYas= value; }
        }
    }
Class ın Kullanılması
Öncelikle Classımızın adında geriye donus yapan bir metot yazılır.
public class Kisi{
public static Result BirdenFazlaParametreDondur()
{
    Result rs=new Result();
    rs.KisiYas=5;
    rs.KisiAdi="Gökhan Mentese";

   return rs;
}
}
Kod anında metotun kullanımı
Result kisiBilgileri=Kisi.BirdenFazlaParametredondur();
string ad=kisiBilgileri.KisiAdi;
int yas=kisiBilgileri.KisiYas;

Sorularınızı gkhnmntsqgmail adresine atabilirsiniz.

C# String Methodları – II (Replace, SubString, ToCharArray, Trim)



String method ları bizim sıkça kullanacağımız ve ihtiyaç duyacağımız methodlardır. Hepimizin şimdiye kadar aşağıdaki durumlar ile ya karşılaştık ya da karşılaşacağız;

String içerisindeki bir string i değiştirme,
String içerisinde belli bir yerden, belli bir sayı kadar karakter alma,
Bir string i karakterlerine ayırma,
String in başlangıcındaki ve/veya bitimindeki boşlukları silme,
Bu ve benzeri işlemleri yapmak için bu yazımda anlatacağım String Methodlarını kullanacağız. Bu yazımda anlatacağım Methodlar; Replace, SubString, ToCharArray, Trim

Replace
Kullanımı bazen oldukça işine yarabilir. String içerisinde bir string i başka bir string ile değiştirebilirsiniz veya string içerisinde karakteri(char) başka bir karakter ile değiştirebilirsiniz. İlk önce değiştireceğimiz stringi veya char ı daha sonrada değişlik için kullanacağımız stringi veya char ı yazıyoruz.

kelime = "Buradaki tüm a harfleri büyük";
MessageBox.Show(kelime.Replace('a', 'A')); // tek tırnak ile tanımladık, yani char türünde, çıktı olarak "BurAdAki tüm A hArflari büyük"

kelime2 = "C# %100 nesneye yönelimli bir programlama dilidir. ";
MessageBox.Show(kelime2.Replace("neseneye yönelimli", "nesne tabanlı")); // ekran çıktısı:

SubString()
 String içerisinde belli bir karakterden sonraki bölümü seçmemiz yarar. 2 türlü kullanımı vardır;

1. Kullanım

string kelime = "Gökhan Menteşe"; //Burada "G" 0.karakterdir. Bunu unutmamak gerekiyor
MessageBox.Show(kelime.Substring(6,7)); //Ekran çıktısı olarak "Menteşe" ı verecektir. 6.karakterden başlayarak 7tane seçim yapar.Sunu da hatırlamakta fayda var.Bosluk ta bir karakterdir.

2.Kullanım
string kelime = "Gökhan Menteşe";
MessageBox.Show(kelime.Substring(6)); //Ekran çıktısı olarak "Menteşe" yi verecektir. 6.karakterden başlayarak son karaktere kadar seçim yapar

ToCharArray()

String içeriğini karaktere ayırır. 2 türlü kullanımı vardır;

1.Kullanım

char[] karakterler = kelime.ToCharArray(); // Anahtar bölüm işte burası, burada karakterler adında char türünde bir dizi oluşturuluyor ve içerisine atılıyor. Yani aşağıdaki foreach yerine karakterler[sayi] diyerek ulaşabilirsiniz.
foreach (char karakter in karakterler) // Foreach bu tarz işlemler için tam anlamıyla biçilmiş kaftandır. Örnekte iyi olacağını düşünüyorum
{
listBox1.Items.Add(karakter); // Bu bölümde bulunan karakterleri listbox1 a sırayla ekliyor. Yani ekran çıktısı olarak sırasıyla alt alta;G,Ö,K,H,A,N, ,M,E,N,T,E,Ş,E dir. Boşluklarında dahil olduğunu unutmayalım. Burada bir if kontrolü ile boşlukları eklemeyebiliriz.
}

2.Kullanım

char[] karakterler = kelime.ToCharArray(3,5); //SubStringteki mantık ile çalışır yani 3.index numarasından başlar ve daha sonraki 5 karakteri alır.

Trim()

Özellikle web uygulamalarında çok yaygın şekilde kullanılan bir uygulamadır trim. Bir string in başlangcındaki ve bitişindeki boşlukları temizler ve bize sadece yazılan içeriği yani anlamlı bölümü verir. TrimEnd ve TrimStart gibi methodlardan mevcuttur. Bunları burada anlatmayacağım. Uygulamalar yaptığımda eğer gerekirse kullanırım ve bunları paylaşırım.

Kullanım

string kelime = "     Gökhan Menteşe       ";
MessageBox.Show(kelime.Trim()); //Ekran çıktısı olarak "Gökhan Menteşe" yi verecektir. Kenardaki boşluları almayacaktır. Bu örneği iyi anlamak için önce boşluklu halinin Length ile uzunluğunu alıp daha sonra bu işlem sonucunda aldığınızda aradaki farkı göreceksiniz.

Trim, TrimEnd, TrimStart : Parametre olarak verilen bir karakteri değişkenin başından ve sonundan kaldırır.Herhangi bir karakter belirtilmediği zaman boşlukları kaldırır.

Kullanım Şekli : st1.Trim(“?”) st1.TrimStart(“?”) Başından Kaldırır. st1.TrimEnd(“?”) Sonundan Kaldırır.

class Program

{ // Daha fazla bilgi için : www.gorselprogramlama.com

static void Main(string[] args)

{
string str1, str2;

Console.Write("1. stringi giriniz = ");

str1 = Console.ReadLine();

Console.Write("2. stringi giriniz = ");

str2 = Console.ReadLine(); //

if (string.Compare(str1, str2) == 0) Console.Write("Stringler aynı");

else Console.Write("Stringler farklı");

Console.ReadKey();
}

}
 örnekte ikinci kelimeden sonra bir kaç defa boşluk tuşuna bastım.Ve farklı dedi.Bunu engellemek için Trim özelliğini kullanabiliriz.

Örnek: Trim ekleyerek yapalım. 

class Program
{
static void Main(string[] args)

{
string str1, str2;
Console.Write("1. stringi giriniz = ");
str1 = Console.ReadLine();

Console.Write("2. stringi giriniz = ");
str2 = Console.ReadLine();

if (string.Compare(str1.Trim(), str2.Trim()) == 0)
       Console.Write("Stringler aynı");
else
      Console.Write("Stringler farklı");

Console.ReadKey();
}
}
ikinci kelimeden sonra bir kaç defa boşluk tuşuna bastım.Trim ile bu boşluklar alındığı için kelimeler aynı dedi.

DataTable daki Verileri İki Boyutlu Diziye Atama

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

namespace ConnectExcel
{
   public class SatirSatirOkuma 
    {
        public string [,] SatirOkuma(DataTable dt)
        {
            string [,] dizi=new string[dt.Rows.Count,dt.Columns.Count];

            byte i = 0;
            foreach (DataRow row in dt.Rows)//satır satır verileri alma
            {
                for (int j = 0; j <dt.Columns.Count ; j++)
                {
                    dizi[i, j] = row[j].ToString();
                }
                   i++;               
            }
            return dizi;
        }
    }
}

C# da Excel e Bağlanma ve VeriLeri Okuma Sınıfı 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;
using System.IO;


namespace ConnectExcel
{
    public class ExceleBaglanma
    {
        OleDbConnection baglanti;
        OleDbCommand komut;
        DataTable dt=null;
        DataSet dataset=null;

        public ExceleBaglanma(string dosyayolu)  //KURUCU
        {
            var ext = dosyayolu.Substring(dosyayolu.LastIndexOf('.') + 1).ToLower();

            if (ext=="xlsx") // dosya uzantısına göre baglantı satırı verir.Her format için farklıdır.
            {
                baglanti = new OleDbConnection("Data Source=" + dosyayolu + ";Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0");
            }
            else if(ext=="xls")
            {
                baglanti = new OleDbConnection("Data Source=" + dosyayolu + ";Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0");
            }
        }

        public DataTable ExcelVerileriniAl(string dosyayolu)
        {
            try
            {
                komut = new OleDbCommand("select * from [Sheet1$A:C]", baglanti);

                if (baglanti.State == ConnectionState.Closed)
                {
                    baglanti.Open();
                }

                //OleDbDataReader oku = komut.ExecuteReader();
                dt = new DataTable();
                dataset = new DataSet();

                OleDbDataAdapter adap = new OleDbDataAdapter(komut);

                adap.Fill(dataset);

                //Excel'de bulunan datalar .Net tarafında bir Datatable'a alındı
                dt = dataset.Tables[0];
                
                //Upload edilen excel dosyasını serverdan sil...
                File.Delete(dosyayolu);

                return dt;
            }
            catch (Exception)
            {
                return null;
            }
            finally
            {
                baglanti.Dispose();
                baglanti.Close();
            }  
        }

NOT:Projemize excel için gerekli olan dll leri eklemeyi unutmayalım.

Try.Parse Kullanımı C# (Label ın Text ini Integer a Çevirme)

Label  lblSayi=new Label();

lblSayi.Text="12345";

Bu değeri integer a çevirme işlemini,

int sayi=Convert.ToInt32(lblsayi.Text);

şeklinde yazacak olursak hata verecektir.Bu dönüşümü ben try.Parse adlı kod ile çözdüm.

int.TryParse(lblSayi.Text,out degiskenSayi);

yukarıdaki kod ile degiskenSayi adlı değişkene label daki text integer a cevrilerek atandı.Artık degiskenSayi
integer bir değer saklamaktadır.

ÖRNEK KOD:







C# da DOSYAYA YAZMA

 FileInfo fi=new FileInfo("c:/loglar.txt");//dosyanın ısım bılgısını tutar dosya var mı yok mu bakılacak

FileStream fs;

if(fi.Exists)// dosya daha onceden olusturulmussa dosya acılıp yazılacak
fs=new FileStream("c:/loglar.txt",FileMode.Append);
else
fs=new FileStream("c:/loglar.txt",FileMode.Crate);// dosya yoksa olusturulur 

StreamWriter sw=new StreamWriter(fs); // dosyaya yazmakiçin StreamReader dosyadan okumak
sw.WriteLine("ıanhdıa" + DateTime.Now + "fvfdvd");
sw.Flush();
fs.Close();

C# da DLL OLUŞTURMA


DLL olusturmak için olusturacagımız class ismine sag tıklayıp Build dememız
yeterlıdır.

Degısıklıkten sonra ReBuild deriz.

DLL i projemıze eklemek ıcın se ,Proje adına sag tıklayıp ADD REFERENCE deyıp.
PROJE sekmesınden dll imizi secmemız gerekır.

DLL olusturmak daha mantıklıdır.DLL olustuktan sonra claasımızı sılsek de calısır.

Ayrıca DLL imizi kullanırken projemıze namespace ını eklememız lazım.

ÖRNEK:

using Class1;

C# - C# ile Metot oluşturma ve kullanımı



 int MetotAdi(int a,int b)
 {
    return a+b;
 }
Bu metot, iki tane int türünden girdi alır ve bu girdilerin toplamını int türünden tutar. Ancak bu metodu programımız içinde kullanabilmemiz için bu metodun içinde bulunduğu sınıf türünden bir nesne yaratıp "." operatörüyle bu nesne üzerinden metodumuza erişmeliyiz. Örnek:
 using System;
 class Metotlar
 {
    int Topla(int a,int b)
    {
       return a+b;
    }
    static void Main()
    {
       Metotlar nesne=new Metotlar();
       int a=nesne.Topla(2,5);
       Console.Write(a);
    }
 }
  • static olarak tanımlanan metotlara erişmek için metodun içinde bulunduğu sınıf türünden bir nesne yaratmaya gerek yoktur. static olarak tanımlanan metotlara sadece metodun adını yazarak erişilebilir. Örnek:
 using System;
 class Metotlar
 {
    static int Topla(int a,int b)
    {
       return a+b;
    }
    static void Main()
    {
       int a=Topla(2,5);
       Console.Write(a);
    }
 }
  • Bütün programlarda önce Main metodu çalışır. Diğer metotlar Main metodunun içinden çağrılmadıkça çalışmaz.
  • Eğer metot, içinde bulunduğumuz sınıfta değil de, başka bir sınıf içinde yaratılmışsa o metodu kullanabilmek için önce sınıfı yazmamız gerekir. Örnek:
 using System;
 class Metotlar1
 {
    public static int Topla(int a,int b)
    {
       return a+b;
    }
 }
 class Metotlar2
 {
    static void Main()
    {
       int a=Metotlar1.Topla(2,5);
       Console.Write(a);
    }
 }
Dikkat ettiyseniz bu metodun yaratılma satırının (4. satır) başına public anahtar sözcüğü konmuş. public sözcüğüyle derleyiciye bu metoda her sınıftan erişilebileceğini söylüyoruz. Eğer public sözcüğü yazılmamış olsaydı bu metoda sadece Metotlar1 sınıfından erişilebilirdi.
  • Şimdi de static olmayan bir metodu başka bir sınıf içinde yaratalım ve kullanalım:
 using System;
 class Metotlar1
 {
    public int Topla(int a,int b)
    {
       return a+b;
    }
 }
 class Metotlar2
 {
    static void Main()
    {
       Metotlar1 nesne=new Metotlar1();
       int a=nesne.Topla(3,9);
       Console.Write(a);
    }
 }
  • Bütün değer tutan metotlar bir değermiş gibi kullanılabilir, ancak değişkenmiş gibi kullanılamaz.
  • Herhangi bir değer tutmayan (WriteLine gibi) metotları void anahtar sözcüğüyle yaratırız. Örnek:
 using System;
 class Metotlar1
 {
    static void Yaz(object a,int b)
    {
       for(;b>0;b--)
          Console.Write(a);
    }
    static void Main()
    {
       Yaz("deneme",5);
    }
 }
Burada oluşturduğumuz Yaz metodu aldığı ilk parametreyi ikinci parametre kere ekrana yazar. Örneğin programımızda "deneme" stringi ekrana 5 kez yazdırılıyor.
  • Herhangi bir değer tutmayan metotlarda return; komutu, yanına herhangi bir ifade olmadan kullanılabilir. Aslında return; komutunun asıl görevi metottan çıkmaktır, ancak yanına bazı ifadeler koyularak metodun tuttuğu değeri belirtme vazifesi de görür. Örneğin bir if koşulu yaratıp, eğer koşul sağlanırsa metottan çıkılmasını, koşul sağlanmazsa başka komutlar da çalıştırılmasını sağlayabiliriz. Ancak doğal olarak bir metodun son satırında return; komutunun kullanılması gereksizdir. Örnek kullanım:
 using System;
 class Metotlar1
 {
    static void Yaz(object a,int b)
    {
        if(b>10)
          return;
        for(;b>0;b--)
          Console.Write(a);
    }
    static void Main()
    {
       Yaz('n',10);
    }
 }
Bu programda eğer metoda verilen ikinci parametre 10'dan büyükse metottan hiçbir şey yapılmadan çıkılıyor.

Metotlarla ilgili önemli özellikler
  • Metotları kullanırken parametrelerini doğru sayıda, doğru sırada ve doğru türde vermeliyiz.
  • Değer tutan metotlarda return satırıyla belirtilen ifade, metodu yaratırken verilen türle uyumlu olmalıdır.
  • Değer tutmayan (void ile belirtilmiş) metotlarda return komutunun herhangi bir ifadeyle kullanılması yasaktır.
  • Değer tutmayan metotların bir değermiş gibi kullanılması yasaktır.
  • Metotlar değer tutmayabileceği gibi, parametre de almayabilirler. Örnek program:
 using System;
 class Metotlar1
 {
    static void Yaz()
    {
          Console.Write("deneme");
    }
    static void Main()
    {
       Yaz();
    }
 }
Buradaki ekrana "deneme" yazan metot herhangi bir parametre almaz. Dolayısıyla da programda kullanırken de parantezlerin içine hiçbir şey yazılmaz.
  • Bir metodun içinde başka bir metot yaratılamaz. Örneğin aşağıdaki gibi bir kullanım hatalıdır:
 using System;
 class Metotlar1
 {
    static void Yaz()
    {
          Console.Write("deneme");
          static void Ciz()
          {
             Console.Write("\n");
          }
    }
    static void Main()
    {
       Yaz();
    }
 }
  • Metot yaratılırkenki metot parantezinde "static void Yaz(object a,int b)" veya metot küme parantezlerinin içinde tanımlanan değişkenler metottan çıkıldığında bellekten silinirler. Eğer aynı metot tekrar çağrılırsa söz konusu değişkenler tekrar tanımlanıp tekrar değerler atanır.
  • Metot yaratılırkenki metot parantezindeki değişkenlerin türleri tek tek belirtilmelidir. Virgül ile ortak tür belirtimi yapılamaz. Yani static void Ornek(int a,int b) yerine static void Ornek(int a, b) yazılamaz.

Metot parametresi olarak diziler
Örnek:
 using System;
 class Metotlar1
 {
    static void Yaz(int[] dizi)
    {
          foreach(int i in dizi)
             Console.WriteLine(i);
    }
    static void Main()
    {
          int[] dizi={1,2,4,7,9};
          Yaz(dizi);
    }
 }
Buradaki Yaz metodu kendisine parametre olarak verilen dizinin elemanlarını alt alta yazdı. Eğer yalnızca int[] türündeki değil bütün türlerdeki dizileri ekrana yazan bir metot yazmak istiyorsak:
 using System;
 class Metotlar1
 {
    static void Yaz(Array dizi)
    {
          foreach(object i in dizi)
             Console.WriteLine(i);
    }
    static void Main()
    {
          int[] dizi={1,2,4,7,9};
          Yaz(dizi);
    }
 }
Bu kullanım doğrudur. Ancak aşağıdaki kullanım hatalıdır:
 using System;
 class Metotlar1
 {
    static void Yaz(object[] dizi)
    {
          foreach(object i in dizi)
             Console.WriteLine(i);
    }
    static void Main()
    {
          int[] dizi={1,2,4,7,9};
          Yaz(dizi);
    }
 }
Çünkü dizilerde değişkenlerdeki gibi bir bilinçsiz tür dönüşümünden bahsetmek imkansızdır.

Dizi ve değişken parametreler arasındaki fark
Aşağıdaki iki programı karşılaştırın:
 using System;
 class Metotlar1
 {
   static void Degistir(int[] dizi)    
   {
         for(int i=0;i<5;i++)
             dizi[i]=10;
   }
   static void Yaz(Array dizi)
   {
         foreach(object a in dizi)
             Console.WriteLine(a);
   }
   static void Main()
   {
         int[] dizi={1,2,4,7,8};
         Degistir(dizi);
         Yaz(dizi);
   }
 }
 using System;
 class Metotlar1
 {
   static void Degistir(int sayi)    
   {
         sayi=10;
   }
   static void Yaz(int sayi)
   {
         Console.WriteLine(sayi);
   }
   static void Main()
   {
         int sayi=1;
         Degistir(sayi);
         Yaz(sayi);
   }
 }
Bu iki programı çalıştırdığınızda göreceksiniz ki metoda parametre olarak aktarılan dizinin metot içinde bir elemanının değiştirilmesi esas diziyi etkiliyor. Ancak metoda parametre olarak aktarılan değişkenin metot içinde değiştirilmesi esas değişkeni etkilemiyor. Çünkü bir metoda parametre olarak bir dizi verildiğinde derleyici metoda dizinin bellekteki adresini verir; metot o adresteki verilerle çalışır. Dolayısıyla da dizinin herhangi bir elemanındaki değişiklik esas diziyi etkileyecektir. Çünkü gerek esas program, gerekse de metot aynı adresteki verilere erişir. Halbuki bir metoda parametre olarak bir değişken verdiğimizde metot için değişkenin bellekteki adresi önemli değildir, metot için önemli olan değişkenin değeridir. Metot, değişkeni kullanabilmek için geçici bir bellek bölgesi yaratır ve parametre olarak aldığı değişkenin değerini bu geçici bellek bölgesine kopyalar ve o geçici bellek bölgesiyle çalışır. Metottan çıkıldığında da o geçici bellek bölgesi silinir.
Peki bir metoda aktarılan bir değişkende yapılan bir değişikliğin tıpkı dizilerdeki gibi esas değişkeni etkilemesini ister miydiniz? İşte bunun için C#'ın ref ve outolmak üzere iki anahtar sözcüğü vardır.

ref anahtar sözcüğü

Örnek:
 using System;
 class Metotlar1
 {
   static void Degistir(ref int sayi)    
   {
         sayi=10;
   }
   static void Yaz(int sayi)
   {
         Console.WriteLine(sayi);
   }
   static void Main()
   {
         int sayi=1;
         Degistir(ref sayi);
         Yaz(sayi);
   }
 }
ref anahtar sözcüğü değişkenlerin metotlara adres gösterme yoluyla aktarılmasını sağlar. Gördüğünüz gibi ref sözcüğünün hem metodu çağırırken , hem de metodu yaratırken değişkenden önce yazılması gerekiyor. Bu program ekrana 10 yazacaktır. Ayrıca ref sözcüğüyle bir değişkenin metoda adres gösterme yoluyla aktarılabilmesi için esas programda değişkene bir ilk değer verilmelidir. Yoksa program hata verir. Örneğin aşağıdaki program hata verir:
 using System;
 class Metotlar1
 {
   static void Degistir(ref int sayi)    
   {
         sayi=10;
   }
   static void Yaz(int sayi)
   {
         Console.WriteLine(sayi);
   }
   static void Main()
   {
         int sayi;
         Degistir(ref sayi);
         Yaz(sayi);
   }
 }

out anahtar sözcüğü

Kullanımı ref anahtar sözcüğüyle tamamen aynıdır. Tek farkı out ile belirtilen değişkenlere esas programda bir ilk değer verilmesinin zorunlu olmamasıdır. Örneğin aşağıdaki kullanım tamamen doğrudur.
 using System;
 class Metotlar
 {
   static void Degistir(out int sayi)    
   {
         sayi=10;
   }
   static void Yaz(int sayi)
   {
         Console.WriteLine(sayi);
   }
   static void Main()
   {
         int sayi;
         Degistir(out sayi);
         Yaz(sayi);
   }
 }
NOT: ref sözcüğünün dizilerle kullanımı gereksiz olmasına rağmen C# bunu kısıtlamamıştır. Ancak out sözcüğü dizilerle kullanılamaz.
Metotların aşırı yüklenmesi
C#'ta parametre sayısı ve/veya parametrelerin türleri farklı olmak şartıyla aynı isimli birden fazla metot yaratılabilir. Buna metotların aşırı yüklenmesi denir.
C#, bir metot çağrıldığında ve çağrılanla aynı isimli birden fazla metot bulunduğunda metodun çağrılış biçimine bakar. Yani ana programdaki metoda girilen parametrelerle yaratılmış olan metotların parametrelerini kıyaslar. Önce parametre sayısına bakar. Eğer aynı isimli ve aynı sayıda parametreli birden fazla metot varsa bu sefer parametre türlerinde tam uyumluluk arar, parametre türlerinin tam uyumlu olduğu bir metot bulamazsa bilinçsiz tür dönüşümünün mümkün olduğu bir metot arar, onu da bulamazsa programımız hata verir. Örnekler:
 using System;
 class Metotlar
 {
   static void Metot1(int x,int y)    
   {
         Console.WriteLine("1. metot çağrıldı.");
   }
   static void Metot1(float x,float y)
   {
         Console.WriteLine("2. metot çağrıldı.");
   }
   static void Metot1(string x,string y)
   {
         Console.WriteLine("3. metot çağrıldı.");
   }
   static void Main()
   {
         Metot1("deneme","deneme");
         Metot1(5,6);
         Metot1(10f,56f);
   }
 }
Bu programda üç metot da aynı sayıda parametre almış. Bu durumda parametrelerin türlerine bakılır. Ana programdaki Metot1("deneme","deneme");satırıyla üçüncü metot çağrılır. Metot1(5,6); metot çağrımının parametre türlerinin tam uyumlu olduğu metot birinci metottur, o yüzden birinci metot çağrılır. Eğer birinci metot yaratılmamış olsaydı ikinci metot çağrılacaktı. Son olarak Metot1(10f,56f); satırıyla da ikinci metot çağrılır. Başka bir örnek:
 using System;
 class Metotlar
 {
   static void Metot1(float x,float y)    
   {
         Console.WriteLine("1. metot çağrıldı.");
   }
   static void Metot1(double x,double y)
   {
         Console.WriteLine("2. metot çağrıldı.");
   }
   static void Main()
   {
         Metot1(5,6);
   }
 }
Bu programda iki metodun da parametre sayısı eşit, iki metotta da tam tür uyumu yok ve iki metotta da bilinçsiz tür dönüşümü mümkün. Bu durumda en az kapasiteli türlü metot çağrılır. Yani bu programda birinci metot çağrılır. Başka bir örnek:
 using System;
 class Metotlar
 {
   static void Metot1(float x,float y)    
   {
         Console.WriteLine("1. metot çağrıldı.");
   }
   static void Metot1(int x,int y)
   {
         Console.WriteLine("2. metot çağrıldı.");
   }
   static void Main()
   {
         Metot1(5,6.4f);
   }
 }
Bu durumda birinci metot çağrılır. Başka bir örnek:
 using System;
 class Metotlar
 {
   static void Metot1(float x,float y)    
   {
         Console.WriteLine("1. metot çağrıldı.");
   }
   static void Metot1(int x,int y)
   {
         Console.WriteLine("2. metot çağrıldı.");
   }
   static void Main()
   {
         Metot1('f','g');
   }
 }
Bu durumda ikinci metot çağrılır. Çünkü char hem inte hem de floata bilinçsiz olarak dönüşebilir. Ancak int daha az kapasitelidir.
NOT: Metotların geri dönüş tipi (tuttuğu değerin tipi) faydalanılabilecek ayırt edici özelliklerden değildir. Yani iki metodun parametre sayısı ve parametre türleri aynı ise tuttuğu değer tipleri farklı olsa bile bunların herhangi biri çağrılmak istendiğinde programımız derlenmeyecektir.
 using System;
 class Metotlar
 {
   static void Metot1(int x,int y,int z)    
   {
         Console.WriteLine("1. metot çağrıldı.");
   }
   static void Metot1(int x,int y)
   {
         Console.WriteLine("2. metot çağrıldı.");
   }
   static void Metot1(float x,int y)
   {
         Console.WriteLine("3. metot çağrıldı.");
   }
   static void Main()
   {
         Metot1(3,3,6);
         Metot1(3.4f,3);
         Metot1(1,'h');
   }
 }
Burada sırasıyla 1., 3. ve 2. metotlar çağrılacaktır.

Değişken sayıda parametre alan metotlar
Şimdiye kadar metotlarımıza gönderdiğimiz parametre sayısı belliydi ve bu parametre sayısından farklı bir miktarda parametre girersek programımız hata veriyordu. Artık istediğimiz sayıda parametre girebileceğimiz metotlar yapmasını göreceğiz. Örnek:
 using System;
 class Metotlar
 {
    static int Toplam(params int[] sayilar)
    {
       if(sayilar.Length==0)
          return 0;
       int toplam=0;
       foreach(int i in sayilar)
          toplam+=i;
       return toplam;
    }
    static void Main()
    {
       Console.WriteLine(Toplam());
       Console.WriteLine(Toplam(5));
       Console.WriteLine(Toplam(5,10));   
       Console.WriteLine(Toplam(2,9,12));   
       Console.WriteLine(Toplam(7,12,45));   
       Console.WriteLine(Toplam(123,12,5,7,9,4,12));
    }
 }
Burada aldığı parametrelerin toplamını tutan bir metot yazdık. Eğer metoda hiç parametre girilmemişse 0 değerini döndürmektedir. Gördüğünüz gibi paramsanahtar sözcüğüyle girilen tüm parametreleri int[] türündeki sayilar dizisine aktardık ve bu diziyi metotta gönlümüzce kullandık. Bir de bu programımızda Lengthözelliğini gördünüz. Özellikler metotlara benzerler, metotlardan tek farkları "()" kısımları olmamasıdır. Dolayısıyla parametre almazlar. Örneğimizdesayilar.Length satırı sayilar dizisinin eleman sayısını int türünden tutar. Başka bir örnek:
 using System;
 class Metotlar
 {
    static int Islem(string a,params int[] sayilar)
    {
       if(a=="carp")
       {
          if(sayilar.Length==0)
             return 1;
          int carpim=1;
          foreach(int i in sayilar)
             carpim*=i;
          return carpim;
       }
       else if(a=="topla")
       {
          if(sayilar.Length==0)
             return 0;   
          int toplam=0;
          foreach(int i in sayilar)
             toplam+=i;
          return toplam;
       }
       else
          return 0;    
    }
    static void Main()
    {
       Console.WriteLine(Islem("topla",3,4,7,8));
       Console.WriteLine(Islem("carp",5,23,6));
    }
 }
Bu programdaki gibi metodumuzda değişken parametre yanında bir ya da daha fazla normal sabit parametre de olabilir. Ancak değişken parametre mutlaka en sonda yazılmalıdır.
NOT: Değer döndüren metotlarımız mutlaka her durumda değer döndürmelidir. Örneğin metodumuzda sondaki else kullanılmazsa programımız derlenmez. Çünkü else'i kullanmasaydık birinci parametre yalnızca "carp" veya "topla" olduğunda metodumuz bir değer döndürecekti. Ve bu da C# kurallarına aykırı.
NOT: Değişken sayıda parametre alan metotlar aşırı yüklenmiş metotlar olduğunda değerlendirilmeye alınmaz. Örnek:
 using System;
 class Metotlar
 {
   static void Metot1(int x,int y)    
   {
         Console.WriteLine("1. metot çağrıldı.");
   }
   static void Metot1(int x,params int[] y)
   {
         Console.WriteLine("2. metot çağrıldı.");
   }
   static void Main()
   {
         Metot1(3,6);
   }
 }
Burada 1. metot çağrılır. Ancak,
 using System;
 class Metotlar
 {
   static void Metot1(int x,int y)    
   {
         Console.WriteLine("1. metot çağrıldı.");
   }
   static void Metot1(int x,params int[] y)
   {
         Console.WriteLine("2. metot çağrıldı.");
   }
   static void Main()
   {
         Metot1(3,6,8);
   }
 }
Burada 2. metot çağrılır.

Kendini çağıran metotlar
C#'ta bir metodun içinde aynı metot çağrılabilir. Örnek:
 using System;
 class Metotlar
 {
    static int Faktoriyel(int a)
    {
       if(a==0)
          return 1;
       return a*Faktoriyel(a-1);
    }
    static void Main()
    {
       Console.WriteLine(Faktoriyel(0));
       Console.WriteLine(Faktoriyel(1));
       Console.WriteLine(Faktoriyel(4));
       Console.WriteLine(Faktoriyel(6));
    }
 }
Programlamadaki metot kavramı aslında matematikteki fonksiyonlar konusunun aynısıdır. Matematikteki fonksiyonlar konusunda öğrendiğiniz bütün kuralları metotlarda uygulayabilirsiniz. Örneğin yukarıdaki örnek, matematikteki fonksiyonları iyi bilen birisi için fazla karmaşık gelmeyecektir. Örneğin:
  • Matematikteki fonksiyonlar konusunu bilen birisi bilir ki bir fonksiyona parametre olarak o fonksiyonun tersini verirsek sonuç x çıkacaktır. Örneğin f(x)=2x+5 olsun. f(x) fonksiyonunun tersi f-1(x)=(x-5)/2'dir. Şimdi f(x) fonksiyonuna parametre olarak (x-5)/2 verirsek sonuç x olacaktır. Yani f(x)○f-1(x)=x'tir. Şimdi bu kuralı bir metotla doğrulayalım.
 using System;
 class Metotlar
 {
    static float Fonksiyon(float x)
    {
       return 2*x+5;
    }
    static float TersFonksiyon(float x)
    {
       return (x-5)/2;
    }
    static void Main()
    {
       float x=10;
       Console.WriteLine(Fonksiyon(x));
       Console.WriteLine(TersFonksiyon(x));
       Console.WriteLine(Fonksiyon(TersFonksiyon(x)));
    }
 }
Bu program ekrana sırasıyla 25, 2.5 ve 10 yazacaktır. Eğer ortada bir bölme işlemi varsa ve matematiksel işlemler yapmak istiyorsak değişkenler int türünden değil, float ya da double türünden olmalıdır. Çünkü int türü ondalık kısmı almaz, dolayısıyla da int türüyle yapılan bölme işlemlerinde hatalı sonuçlar çıkabilir. Çünkü örneğin 2 sayısı 2.5 sayısına eşit değildir.
Main metodu
Bildiğiniz gibi çalışabilir her programda Main metodunun bulunması gerekiyor. Bütün programlarda önce Main metodu çalıştırılır. Diğer metotlar Main metodunun içinden çağrılmadıkça çalışmaz. Bu özellikler dışında Main metodunun diğer metotlardan başka hiçbir farkı yoktur. Ancak şimdiye kadar Main metodunu yalnızcastatic void Main() şeklinde yarattık. Yani herhangi bir parametre almadı ve herhangi bir değer tutmadı. Ancak Main metodunun bir değer tutmasını veya parametre almasını sağlayabiliriz.


Main metodunun değer tutması

Main metodunu static int Main() şeklinde de yaratabiliriz. Peki bu ne işimize yarayacak? Buradaki kritik soru "Main metodunu kim çağırıyor?"dur. Biraz düşününce bu sorunun cevabının işletim sistemi olduğunu göreceksiniz. Peki işletim sistemi Main metodunun tuttuğu değeri ne yapacak? Programlar çeşitli şekillerde sonlanabilirler. Örneğin Main metodu 0 değerini döndürürse işletim sistemi programın düzgün şekilde sonlandırıldığını, 1 değerini döndürürse de hatalı sonlandırıldığını anlayabilecektir. Ancak şimdilik bunları kullanmamıza gerek yok.


Main metodunun parametre alması

Tahmin edeceğiniz gibi Main metoduna parametreler işletim sisteminden verilir. Main metodu, komut satırından girilen argümanları string türünden bir diziye atayıp programımızda gönlümüzce kullanmamıza izin verir.
static void Main(string[] args)
Burada komut satırından girilen argümanlar string[] türündeki args dizisine aktarılıyor. Bu diziyi programımızda gönlümüzce kullanabiliriz. Örneğin programımız deneme.exe olsun. Komut satırından
deneme ayşe bekir rabia
girilirse ilk sözcük olan deneme ile programımız çalıştırılır ve ayşe, bekir ve rabia sözcükleri de string[] türündeki args dizisine aktarılır. Örnek bir program:
using System;
 class Metotlar
 {
    static void Main(string[] args)
    {
       Console.WriteLine("Komut satırından şunları girdiniz: ");
       foreach(string i in args)
          Console.WriteLine(i);
    }
 }
Bu program komut satırından girilen argümanları ekrana alt alta yazacaktır. Komut satırında program adından sonra girilen ilk sözcük args dizisinin 0. indeksine, ikinci sözcük 1. indeksine, üçüncü sözcük 2. indeksine vs. aktarılır.

System.Math sınıfı ve metotları
.Net sınıf kütüphanesinde belirli matematiksel işlemleri yapan birçok metot ve iki tane de özellik vardır. System.Math sınıfındaki metotlar static oldukları için bu metotları kullanabilmek için içinde bulundukları sınıf türünden bir nesne yaratmaya gerek yoktur. System.Math sınıfındaki iki özellik matematikteki pi ve e sayılarıdır. Şimdi bu iki özelliği örnek bir programda görelim:
 using System;
 class Metotlar
 {
    static void Main()
    {
       double e=Math.E;
       double pi=Math.PI;
       Console.Write("e->"+e+" pi->"+pi);
    }
 }
PI ve E özellikleri double türünden değer tutarlar. Şimdi System.Math sınıfındaki bütün metotları bir tablo hâlinde verelim:
MetotAçıklama
Abs(x)Bir sayının mutlak değerini tutar.
Cos(x)Bir sayının kosinüsünü tutar.
Sin(x)Bir sayının sinüsünü tutar.
Tan(x)Bir sayının tanjantını tutar.
Ceiling(x) x sayısından büyük en küçük tam sayıyı tutar (yukarı yuvarlama).
Floor(x)x sayısından küçük en büyük tam sayıyı tutar (aşağı yuvarlama).
Max(x,y)x ve y sayılarının en büyüğünü tutar.
Min(x,y)x ve y sayılarının en küçüğünü tutar.
Pow(x,y)x üzeri y'yi tutar.
Sqrt(x)x'in karekökünü tutar.
Log(x)x sayısının e tabanında logaritmasını tutar.
Exp(x)e üzeri x'in değerini tutar.
Log10(x)x sayısının 10 tabanındaki logaritmasını tutar.
Şimdi bir örnek verelim:
 using System;
 class Metotlar
 {
    static void Main()
    {
       int a=Math.Max(10,34);
       int b=Math.Abs(-3);
       double c=Math.Ceiling(12.67);
       Console.Write("Max:"+a+" Abs"+b+" Ceiling:"+c);
    }
 }
Bu metotlar çeşitli türlerden değer döndürebilirler. Örneğin Ceiling metodu double türünden değer döndürürken başka bir metot int türünden değer döndürebilir. Bunları deneyerek bulabilirsiniz. Açıklama yapma gereksinimi görmüyorum.