SOAP(Simple Object Access Protocol) Nedir ?

SOAP, XML tabanlı uygulamalarda HTTP üzerinden bilgi değişimine izin veren protokoldür. Basitçe SOAP, Web Servis erişimi için protokoldür.
SOAP, mesaj göndermek için bir formattır.
SOAP, Internet üzerinden iletişim kurmak amacıyla tasarlanmıştır.
SOAP, platformdan ve programlama dilinden bağımsızdır.
SOAP, firewall(güvenlik duvarına) gelebilmeye izin verir.
SOAP W3C standardıdır.

Sealed Class Nedir ?

Sealed class; kalıtıma katılmayan , kendisinden sınıf üretilmeyen yapılar için oluşturulmuştur.

Bir classın bir başkası tarafından extend veya modify edilmesini istemiyorsak sealed anahtar sözcüğünü kullanabiliriz.

Kalıtıma girmeyecek sınıflar sealed tanımlanarak güvenli, hızlı ve sade bir hal alır.

Syntax yapısı genel olarak aşağıdaki gibidir .

public sealed class  Araba
 {
 // Program kod satırları
 }

Anonymous Tiplerin Propertysine Ulaşmak

C# 3.0 ile gelen Anonymous tiplerin propertylerine aşağıdaki gibi ulaşabiliriz.

var anonymousTypeObject = new { Name = "Lorem", SurName = "Impuls" };

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(anonymousTypeObject);
foreach (PropertyDescriptor loopParam in props)
{
    var paramName = loopParam.Name;
    var paramValue = loopParam.GetValue(anonymousTypeObject);
}

Transaction Isolation Level lar nedir?

SQL Server’da verilerimizi güncellerken, diğer transaction ların verilere nasıl ulaşacağı, lock ların nasıl ve na kadar süre tutulacağı, verilerin nasıl okunacağı  “transaction isolation level” ile karar verilir.

Isolation için   eş zamanlı olarak veri güncellemesi yapan transactionların etkilerinden, diğer transactionları koruma yeteneğidir diyebiliriz.
Her transaction, transaction tamamlanana kadar, güncellen veriyi kilitler.  Veri okuma işlemlerinde, “transaction isolation levels”, diğer transaction lar tarafından yapılan değişikliklerin etkilerinden koruma seviyeleridir.

Daha düşük seviye bir isolation level seçilirse, aynı anda birçok kullanıcı veriyer ulaşabilir ancak okunan veriler tutarlı veya güncel olmayabilir.
Yüksek seviye bir isolation level, okunan verinin tutarlılığını arttırken, bir transaction’ın başka transaction ları kilitlemesine neden olabilir.
Veri tutarlılığının üç temel yan etkisi vardır.
dirty read :  Bir transaction tarafından bir veri güncellenirken verinin okunmasıdır ve veri güncel olmayabilir
nonrepeatable read: Bir başka transaction, aynı satırı birçok kez okur ve her seferinde başka bir veri okursa oluşur.
phantom read : Bir silme veya yeni kayıt ekleme işlemi sırasında, aynı anda okuma işlemi yapılıyorsa ve bu kayıtlar da okunan kayıt setinin içerisindeyse oluşur.  Bu kullanıcının kayıtları eklemediğini düşünmesine ve ikince kez kayıt eklemeye çalışmasına neden olabilir.

En üst seviye isolation “SERIALIZABLE” dır. Tüm transaction her zaman aynı datayı alırlar ancak çok kullanıcılı sistemlerde, bir kullanıcının yaptığı işlem, diğer kullanıcıların işlemlerini etkiler.

En alt seviye isolation ise “READ UNCOMMITTED” dır.  Diğer transactionlar tarafından güncellenmeye başlamış, ancak henüz commit işlemi tamamlanmamış veriler okunabilir.

READ UNCOMMITTED Başka transactionlardan tarafından güncellenmekte olan, ancak henüz güncelleme işlemleri tamamlanmamış veriler okunabilir.

READ COMMITTED  Başka transactionlar tarafından güncellenmekte olan veriler, güncelleme işlemi tamamlanana kadar okunamazlar.  Bu “dirty read” i engeller.  Veri, her bir transaction arasında başka bir transaction tarafından güncellenebilir. Bu seviyede nonrepeatable veya phantom read ler oluşabilir.
READ COMMITTED seviyesi, SQL Server’ın varsayılan isolation seviyesidir.

REPEATABLE READ Güncellenen ancak henüz commit edilmeyen veriler, commit edilene kadar okunamaz veya başka transaction lar tarafından güncellenemez.

SNAPSHOT Veri herhangi bir zamanda okunabilir.  Okuma işlemi başladığında verinin son hali ne ise, o veri okunur.  Okuma için başlayan transaction, sadece başlamadan önce commit edilmiş verileri farkeder. Transaction başladıktan sonra başka bir transaction veriyi güncellerse, bu güncellemeleri görmez.

SERIALIZABLE  Commit edilmemiş veri okunamaz veya güncellenemez. Bir transaction, okunan veri aralığına ait key ile, okuma işlemi tamamlanana kadar insert işlemi yapamaz.

Güvenlik açısından en iyi isolation level Serializable’dır . Performans bakımından en hızlı çalışanı Read Uncommitted’dır.

SQL serverda isolation seviyesi ,

SET TRANSACTION ISOLATION LEVEL
(
READ COMMITTED | READ UNCOMMITTED
| REPEATABLE READ | SERIALIZABLE
)
ifadeleri ile belirtilir.

Alıntıdır.

C# GetValueOrDefault() yani ?? kullanımı

Bir tipin varsayılan değerini döndürmek için de ?? kullanabiliriz. GetValueOrDefault() metodu da bu işlemi yapıyor.
C#’ ın kullanışlı özelliklerinden birisi nullable değer tipleri. Beklenmedik şekilde Null gelen değerler olabilir ve bundan ötürü exception’a düşebiliriz. Bundan kurtulmak için ?? kullanılabilir.

int? nullInt = null;
int? nullOlmayanInt = 2;
nullInt.GetValueOrDefault();    // sonuc 0
nullInt ?? default(int);        // sonuc 0
nullOlmayanInt.GetValueOrDefault(); // sonuc 2
nullOlmayanInt ?? default(int);     // sonuc 2

Crystal Report “Sistem yöneticiniz tarafından konfigüre edilen rapor işleme işi üst sınırına ulaşıldı” Hatası

Configured by your system administrator has been reached the upper limit of the report processingjob

Bu hata adından da anlaşılacağı gibi limiti olan bir yazdırma sayısına ulaşıldığını söylüyor.

IIS’teki uygulamanızı restart ederek geçici olarak çözüme ulaşabilirsiniz.

 

(PrintJobLimit)Yazdırma sayısını yükselterek kesin çözüm sağlayabilirsiniz.

Başlat/Çalıştır/regedit

“HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\InprocServer\PrintJobLimit”

 

Bu yol Crystal versiyonuna göre değişiklik gösterebilir.

 

C#’ta Önişlemci Direktifleri(Preprocessor Directives)

C#’ta Önişlemci kullanım kodları aşağıdaki gibidir.

Koşullu derleme
#define
#undef
#if
#else
#endif
#elif
Derleme
#error
#warning
#line
#pragma
Görsel
#region
#endregion

Kullanımı

static void Main(string[] args)
{
   Console.WriteLine("TEST");

   #if true 
      Console.WriteLine("Kosul saglandi");
   #else
      Console.WriteLine("Kosul saglanmadi");
   #endif
}

float, double, decimal Arasındaki Temel Farklar

Float;
bellekte 4 byte yer kaplar ve basamak hassasiyeti 7 dir.
float sayi=11.2f;
şeklinde tanımlanır.

Double;
bellekte 8 byte yer kaplar. Basamak hassasiyeti 16 dır.
double sayi=11.2d;  veya  double sayi=11.2;
şeklinde tanımlanır.
C# ta ondalıklı bir sayı yazınca varsayılan olarak o sayı double tipindedir.

Decimal;
bellekte 16 byte yer kaplar hem tamsayı hemde ondalıklı sayı barındırabilen bir tipitir. Basamak hassasiyeti 29 karakterdir.
decimal sayi=11.2m;
şeklinde tanımlanır.

Aralarındaki farka gelince float bellekte az yer kapladığı için performans açısından en uygun değer gibi gözüksede 7 basamağa kadar değer alabildiği için kullanım amacı daha küçük sayılarla işlem yapmak içindir.

Örneğin
“float sayi=12.456781f;”
gibi bir tanımlamanın ekran çıktısı 12.45678 olacaktır,
son basamak 8. Basamağa denk geldiği için ve 5 ten küçük olduğu için dikkate alınmamıştır.
Eğer 5 ten büyük olsaydı son sayı bir üst sayıya yuvarlanarak 12.45679 olacaktı.
double tipinde tanımlanmış bir değişkenin float tipinde tanımlanmış bir değişkenden farkı bellekte kapladığı alan 8 byte ve basamak sayısı 16 dır, diğer özellikleri floatla aynıdır ve C# ondalık sayılar için aksi belirtilmedikçe varsayılan değer olarak double tipini kabul eder.
decimal tipi ise bellekte 16 byte gibi büyük bir yer kaplar,  ondalık sayıları 29 basamağa kadar hassiyetle kullanabildiği için ve tamsayı tipleride içinde barındırabildiği için genellikle finansal hesaplamalarda kullanılır.

C# Inheritance Nedir?

Programlama yaparken yaptığımız olay aslında, gerçek hayattaki nesneleri modellemektir. İşte nesneler arasındaki bu ilişkiyi, programdaki nesnelerimize uygulama olayına kalıtım deriz.
Mesela bir şirketteki Personeller için bir sınıf yazacağımızı düşünelim. Basit olarak, tüm personellerin sicil numarası, ad ve maaş bilgilerinin tutan bir sınıf tasarlayalım.

class Personel
{
    long _sicilNo;
    string _ad;
    double _maas;

    public long SicilNo
    {
        get { return _sicilNo; }
        set { _sicilNo = value; }
    }

    public string Ad
    {
        get { return _ad; }
        set { _ad = value; }
    }

    public double Maas
    {
        get { return _maas; }
        set { _maas = value; }
    }

    public Personel(int sicilNo, string ad, double maas)
    {
        SicilNo = sicilNo;
        Ad = ad;
        Maas = maas;
    }
}

Şimdi de Müdür sınıfı tasarlamaya çalışalım. Müdür’ün de sicil numarası, adı ve maaşı mevcuttur. Aynı zamanda; müdür de bir personeldir. İşte bu noktada Müdür sınıfımızı tasarlarken “Müdür is a Personel” ilişkisini belirtmeye çalışalım.

class Mudur : Personel
{
    string _sorumluOlduguDepartman;

    public string SorumluOlduguDepartman
    {
        get { return _sorumluOlduguDepartman; }
        set { _sorumluOlduguDepartman = value; }
    }

    public Mudur(long sicilNo, string ad, double maas, string sorumluOlduguDepartman)
        : base(sicilNo, ad, maas)
    {
        SorumluOlduguDepartman = sorumluOlduguDepartman;
    }
}

Yukarıdaki tasarım ile Mudur’un de bir Personel olduğunu belirtmiş olduk. Bu sayede hem daha doğru bir tasarım yaptık, hem de sicilNo, ad, maas gibi alanları tekrar tanımlama gereği duymadık. Burada görmemiz gereken diğer bir kavram da “base” anahtar sözcüğüdür. burada base anahtar sözcüğünü kullanarak constructor yönlendirmesi yaptık. Böylece, zaten personel sınıfında varolan sicilNo, ad ve maas field’larının Personel sınıfından gelmesini sağlamış olduk.
Şimdi Program tarafında bu iki sınıfın nesnelerini oluşturalım.

class Program
{
    static void Main(string[] args)
    {
        Personel pers = new Personel(123456789, "onur", 5000);

        Mudur mdr = new Mudur(987654321, "ali", 8000, "ARGE");

    }
}

Burada akıllara bir soru gelebilir. Madem Mudur de bir Personeldi, o halde bir mudur nesnesi personel tipinden bir değişkende tutulabilir mi? Elbette tutulabilir. Zaten bu, kalıtımın bize sağladığı bir özelliktir.

class Program
{
    static void Main(string[] args)
    {
        Personel pers = new Mudur(987654321, "ali", 8000, "ARGE");
    }
}

Bu noktada da başka bir sorun ile karşı karşıyayız. Yukarıdaki kod parçasına göre; pers. dediğimizde, new ile örneklediğimiz nesnemiz “Mudur” tipinden olmasına rağmen “sorumluOlduguDepartman” property’sini göremeyeceğiz. Bunun sebebi ise tip güvenliğinin korunmasıdır. nesneyi tutan değişkenin tipi “Personel” dir. Dolayısı ile bu işaretçi üzerinden, sadece o işaretçi tipinin üyelerine erişebiliriz.
Eğer “sorumluOlduguDepartman” property’sine ulaşmak istersek, pers değişkeni üzerinde cast işlemi yapmamız gerekmektedir.

((Mudur)pers).SorumluOlduguDepartman = "Hardware";

Alıntıdır:
http://onursalkaya.blogspot.com.tr/2011/03/c-inheritance.html

C# “static” Kullanımı

Static anahtar sözcüğünün aşağıdaki listede olduğu gibi çeşitli durumlarda kullanabiliriz.

  • Bir sınıf(class) içerisinde bulunan metodlar(methods) static olarak tanımlanabilir.
  • Bir sınıf(class) içerisinde bulunan alanlar (fields) static olarak tanımlanabilir.
  • Bir sınıfa ait static bir yapıcı metod (constructors) tanımlanabilir.
  • Değişmezler (constants) bilinçsiz olarak (implicit) static tanımlanmışlardır.
  • Readonly referanslar açıkça belirtilmedikçe static değildirler.
  • C# 2.0 static sınıflara izin verir.

Normalde bir sınıfın üyesine o sınıftan oluşturulan bir nesne ile erişilmektedir. Örneğin Araba isimli bir sınıfımız var. Bu sınıfın içinde de tekerlek isimli bir değişken var. Eğer değişken static değilse değişkene:

Araba a = new Araba();
a.tekerlek = 4;

şeklinde erişiyoruz. Yani öncelikle sınıfa ait bir nesne oluşturuyor ardından değişken veya metoda ulaşıyoruz. Ancak bazen nesnelerden bağımsız olarak bazı metotlara veya değişkenlere erişmek gerekebilir. Metotlar ve değişkenler static olarak tanımlanabilir.

Static bir metot veya değişken şu şekilde çağrılır;

Araba.Otomobil();
Araba.tekerlek = 4;

“static” değişkenlere global değişkenler diyebiliriz. “static” bir değişkeni tüm üyeler kullanabilir. Yani değeri her yerde aynıdır. Değişken kullanılmadan önce ilk değer ataması yapılır. Eğer ilk değer ataması yapılmazsa nümerik değerler 0, nesne referansları null, bool değişkenler ise false değeri alırlar. Yani static bir değişkenin her zaman bir değeri vardır.

“static” bir metodun this referansı olamaz. “static” bir metot yalnızca kendi sınıfı tarafından tanımlanan static değişkenlere erişebilir. Diğer “static” yapılar;
– static Yapılandırıcılar
Bir sınıfa ait olan özelliklere ilk değerleri atmak için kullanılır.
– static Sınıflar
“static” sınıflar nesne oluşturamaz ve yalnızca static üyeler barındırabilirler.

class StaticMetot
{
    // static olarak tanımlanan değişken
    public static int motor = 1000;
    public int benzin = 3; // static olmadığı için kendi sınıfından olsa bile static olan bir metot erişemez

    // static olarak tanımlanan metot
    public static int Otobus()
    {
        // enerji = 200; hatalı kullanım
        // Insan(); Hatalı kullanım

        StaticMetot st = new StaticMetot();

        st.Otomobil(); // Doğru kullanım
        st.benzin = 2; // doğru kullanım
        return motor / 2;
    }

    public void Otomobil() // static olmadığı için kendi sınıfından olsa bile static olan bir metot erişemez
    {

    }
}

class StaticOrnek
{
    static void Main()
    {
        // static değişkene ilk değer daha sınıfından nesneler oluşmadan atanır
        Console.WriteLine("İlk atanan değer: " + StaticMetot.motor);

        StaticMetot.motor = 60;
        Console.WriteLine("şimdiki değeri: " + StaticMetot.motor);
        Console.WriteLine("Makine metodunun dönüş değeri: " + StaticMetot.Otobus());
    }

}

static class StaticOrnek2
{
    // static bir yapılandırıcı örneği
    static StaticOrnek2()
    {
        int kapi = 4;
        string isim = "Mercedes";
    }

    static void Minibus()
    {

    }
}

Faydalanılan Likler;
http://www.buraksenyurt.com/post/C-Temelleri-Static-Olmak-bsenyurt-com-dan.aspx
http://kod5.org/c-static-kullanimi/