| 
      
        |  SİTE 
            İÇİ ARAMA |  
        |  |  
      
        |  Blogroll |  
        |  |    | 
        
            |  |  
            | 
                    
                        | C# ile İlgili Sık Sorulan Sorular (SSS) |  |  
                        | 
	
    
		
            | Gönderiliyor lütfen bekleyin... | 
 |  |  
            | Bu 
  yazıda C# dili ilgili sık sorulan sorulara yanıt verilmiştir. 
 Aşağıdaki C# ile ilgili sık sorulan sorular www.msdn.com 
  adresinde faaliyet gösteren Microsoft Visual C# ekibi tarafından hazırlanmıştır.
 
 
 S - 1 : DllImport niteliğini neden çalıştıramıyorum?
 
 C - 1 : DllImport ile işaretlenen bütün metotlar public static extern 
  olarak bildirilmelidir.
 
 
 
 S - 2 : Yazdığım switch ifadeleri farklı bir biçimde çalışıyor. Neden?
 
 C - 2 : C# case blokları için "explicit fall through" özelliğini desteklemez. 
  Buna göre aşağıdaki kod parçası geçersizdir ve C#'ta derlenemez.
 
 
 
 
   
  Yukarıdaki 
  kodun verdiği etkiyi C# ile aşağıdaki gibi gerçekleştirrebiliriz. (Case' ler 
  arasındaki akışın açıkça belirtildiğine dikkat edin!) 
    | switch(x)
{
   case 0:
       // bir şeyler yap
   case 1:
       // 0 case'indekine ek olarak birşeyler daha yap
   default:
       // 0 ve 1 durumlarına ek olarak birşeyler daha yap
       break;
} |  
 
 
 
   
   
    | class Test
{
    public static void Main()
    {
        int x = 3;
        switch(x)
        {
            case 0:
                // bir şeyler yap
                goto case 1;
            case 1:
                // 0 case'indekine ek olarak birşeyler daha yap
                goto default;
            default:
                // 0 ve 1 durumlarına ek olarak birşeyler daha yap
                break;
        }
    }
} |  
 S - 3 : const ve static readonly arasındaki farklar nelerdir?
 
 C - 3 : static readonly elemanlar bulundukları sınıfın üye elemanları tarafından 
  değiştirilebilir(!), fakat const olan üye elamanlar asla değiştirilemez ve derleme 
  zamanı sabiti olarak ilk değerleri verilmelidir.
 
 static readonly üye elemanlarının değiştirilebilmesini biraz açacak olursak, 
  static readonly üyeyi içeren sınıf bu üyeyi aşağıdaki durumlarda değiştirebilir 
  :
 
 - değişken ilk değer verilen durumda
 - static yapıcı metotlar içinde
 
 
 
 S - 4 : trace ve asssert komutlarını nasıl gerçekleyebilirim?
 
 C - 4 : Metotlarla birlikte Conditional niteliğini kullanarak gerçekleyebiliriz.
 
 
 
 
 
   
   
    | class Debug
{
    [conditional("TRACE")]
    public void Trace(string s)
    {
        Console.WriteLine(s);
    }
}
class MyClass
{
    public static void Main()
    {
        Debug.Trace("hello");
    }
} |  Yukarıdaki örnekte Debug.Trace() metodu ancak ve ancak TRACE önişlemci seöbolü 
tanımlanmışsa çağrılacaktır. Komut satırından ön işlemci sembollerini tanımlamak 
için /D parametresi kullanılabilir. Conditional niteliği ile bildirilen metotların 
geri dönüş değerinin void olma zorunluluğu vardır.
 
 S - 5 : C#'ta dll oluşturmak için ne yapmalıyım?
 
 C - 5 : Derleyicinin /target:library argümanını kullanmanız gerekir.
 
 
 
 S - 6 : checked isimli bir değişken tanımladığımda neden derleme zamanında 
  "syntax error" hatası alıyorum?
 
 C - 6 : Çünkü checked C#'ta bir anahtar sözcüktür.
 
 
 
 S - 7 : Bir yapıcı metot içinde aşırı yüklenmiş başka bir yapıcı metot nasıl 
  çağrılır (this() ve yapıcımetotadı() şeklindeki çağrımlar derlenmiyor)?
 
 C - 7 : Diğer bir yapıcı metot aşağıdaki gibi çağrılabilir.
 
 
 
 
 
   
  S 
  - 8 : C#'ta Visual J++ ta bulunan instanceof operatörünün karşılığı varmıdır? 
    | class B
{
    B(int i)
    {  }
}
class C : B
{
    C() : base(5)      //  B(5) i çağırır.
    {  }
    C(int i) : this()  //  C() yi çağırır.
    {  }
    public static void Main() {}
} |  
 C - 8 : Evet, is operatörü bunun karşılığıdır. Kullanımı aşağıdaki gibidir 
  :
 
 ifade is 
  tür
 
 
 
 S - 9 : C#'ta enum sabitleri nasıl kullanılır.
 
 C - 9 : enum türlerinin kullanımına bir örnek :
 
 
 
 
   
   
    | namespace Foo
{
    enum Colors
    {
        BLUE,
        GREEN
    }
    class Bar
    {
        Colors color;
        Bar() { color = Colors.GREEN;}
        
        public static void Main() {}
    }
} |  
 S - 10 : Geri dönüş değeri olmayan bir metot bildirimi yaptığımda neden 
  (CS1006) hatası almaktayım?
 
 C - 10 : Bir metodun geri dönüş değerini yazmadan bildirirseniz derleyici onu 
  sanki bir yapıcı metot bildiriyormuşsunuz gibi davranır. O halde geri dönüş 
  değeri olmayan bir metot bildirimi için void anahtar sözcüğünü kullanın. Aşağıda 
  bu iki kullanıma örnek verilmiştir.
 
 
 
 
   
   
    | // Bu bildirim CS1006 hatası verir.
public static staticMethod (mainStatic obj)
// Bu metot ise istenildiği gibi çalışır.
public static void staticMethod (mainStatic obj) |  
 S - 11 : Her birinde farklı Main() metodu olan birden fazla kaynak kod dosyam 
  var: derleme sırasında hangi Main() metodunun kullanılacağını nasıl bildirebilirim?
 
 C - 11 : Programınızın giriş noktası(metodu) Main isimli herhangi bir parametre 
  almayan yada string türünden bir dizi parametresi alan geri dönüş değeri void 
  yada int olan static bir metot olmalıdır.
 
 C# derleyicisi programınızda birden fazla Main metodu bildirmenize izin verir 
  fakat hangi Main() metodunu kullanacağınızı derleme zamanında bildirmeniz gerekir. 
  Main() metodunu belirtirken Main metodunun bulunduğu sınıfın tam yolunu belirtmeniz 
  gerekir. Komut satırından kullanılan /main argümanı bu işe yarar.(Örn : csc 
  /main:MainSınıfı *.cs)
 
 
 
 S - 12 : Console.WriteLine() metodu bir string içinde NULL karakteri gördüğünde 
  ekrana yazma işlemini durdururmu?
 
 C - 12 : Çalışma zamanı için string türleri NULL ile sonlandırılmış türler değildir. 
  Dolayısıyla bir string içine NULL karakteri gömebilirsiniz. Console.WriteLine() 
  ve buna benzer metotlar string değişkeninin sonuna kadar işlem yaparlar.
 
 
 
 S - 13 : C# ta "Multicast Delegate"(çoklu temsilciler) bildirmek 
  mümkünmüdür, mümkünse sentaksı nasıldır?
 
 C - 13 : Bütün temsilciler varsayılan olarak multicast olarak bildirilir. Dolayısıyla 
  Visual J++ taki gibi ayrıca multicast anahtar sözcüğü yoktur.
 
 
 
 S - 14 : Delegate/MulticastDelegate (Temsilciler) nasıl bildirilir?
 
 C - 14 : C# ta temsilci bildirimi için sadece bir parametreye ihtiyacımız vardır 
  : metot adresi. Diğer dillerden farklı olarak C# ta metodun adresi aynı zamanda 
  bu metodun hangi nesne üzerinden de çağrılacağını tutabilir, diğer dillerde 
  ise temsilcilern temsil etttiği metodu çağırabilmek için ayrıca nesnelere ihtiyaç 
  duyulur. Örneğin System.Threading.ThreadStart() metodunun kullanımına bakalım.
 
 
 
 
   
   
    | Foo MyFoo = new Foo();
ThreadStart del = new ThreadStart(MyFoo.Baz); |  Bu, static ve instance metotlarının aynı sentaks ile çağrılabileceğini göstermektedir.
 
 S - 15 : Yaptığım windows pencere uygulamasını her çalıştırdığımda neden 
  pop up şeklinde konsol ekranı gösteriliyor.
 
 C - 15 : Proje ayarlarında "Target Type" özelliğinin Console Application 
  yerine Windows Application olduğuna emin olun. Eğer komut satırı derleyicisini 
  kullanıyorsanız /target:exe argümanı yerine /target:winexe argümanını kullanın.
 
 
 
 S - 16 : Gereksiz çöp toplayısınıcı(Garbage Collection) zorla çağırmanın 
  bir yolu var mı?
 
 C - 16 : Evet; Bütün referasnları null değer atayın ve System.GC.Collect() statik 
  metodunu çağırın.
 
 Yıkılması(destruct) gereken nesneleriniz var ve GC nin bunu yapmadığını düşünüyorsanız 
  nesneleri null değere atayarak onların sonlandırıcı metotlarının çağrılmasını 
  sağlayın ver ardından System.GC.RunFinalizers() metodunu çağırın
 
 
 
 S - 17 : C#, C dilindeki makroları destekliyormu?
 
 C - 17 : Hayır, C# ta makro yoktur.
 
 __LINE__ ve __FILE__ gibi C dilinde önceden tanımlanmış bazı makroların System.Diagnostics 
  isim alanındaki StackTrace ve StackFrame gibi COM+ ile ilgili sınıflardan elde 
  edilebileceğini unutmayın. Fakat bunlar sadece Debug moddaki derleme için çalışacaktır.
 
 
 
 S - 18 : C# derleyicisine bazı dll leri referans vermememe rağmen neden 
  kendisi referans verir.
 
 C - 18 : "csc.rsp" dosyasında bulunan bütün assembly lere C# derleyicisi 
  otomatik olarak referans verir. Bu dosyanın içerdiği assembly leri /r argümanı 
  ile belirtmek zorunda değilsiniz. csc.rsp dosyasının kullanımını komut satırından 
  /noconfig argümanını belirterek engelleyebilirsiniz.
 
 Not : Visual Studio IDE si hiç bir zaman csc.rsp dosyasını kullanmaz.
 
 
 
 S - 19 : Delegate/MulticastDelegate (Temsilciler) nasıl bildirilir?
 
 C - 19 : Aşağıda DllImport niteliğinin kullanımına bir örnek verilmiştir.
 
 
 
 
   
   
    | using System.Runtime.InteropServices;
class C
{
    [DllImport("user32.dll")]
    public static extern int MessageBoxA(int h, string m, string c, int type);
    public static int Main() 
    {
	return MessageBoxA(0, "Hello World!", "Caption", 0);
    }
} |  Yukarıdaki örnek kod yönetilmeyen(unmanaged) DLL deki doğal(native) bir fonksiyonu 
C# ta bildirmek için minumum gereksinimleri gösterir.C.MessageBoxA() metodu static 
ve extern sözcükleri ile bildirilmiş, DllImport niteliği ile bu metodun user32.dll 
dosyasında MessageBoxA ismiyle uygulanmış olduğu belirtilmektedir.
 
 
 S - 20 : COM+ runtime'ında tanımlanan bir arayüzü uygulamaya çalışıyorum 
  ancak "public * Object GetObject{...}" çalışmıyor gibi. Ne yapmalıyım?
 
 C - 20 : Managed C++'ta "Object * GetObject()"(object türünden gösterici) 
  sentaksı geçerlidir. C# ta ise "public Object GetObject()" biçiminde 
  kullanmak yeterlidir.
 
 
 
 S - 21 : C# şablon(template) yapılarını destekliyormu?
 
 C - 21 : Hayır, fakat bir tür şablon olan generics yapılarının C# diline eklenilmesi 
  planlanmaktadır. Bu türler sentaks olarak şablonlara benzerler fakat derleme 
  zamanı yerine çalışma zamanında oluşturulurlar. Bu türlerle ilgili detaylı bilgi 
  için tıklayın.
 
 
 
 S - 22 : Item özelliğini kullandığımda neden CS0117 hatası almaktayım?
 
 C - 22 : C# özellikleri destekler ancak Item özelliğinin sınıflar için özel 
  anlamı vardır. Item özelliği aslında varsayılan indeskleyici olarak yer alır. 
  Bu imkanı C# ta elde etmek için Item sözcüğünü atmak yeterlidir. Aşağıda örnek 
  program gösterilmiştir.
 
 
 
 
 
   
   
    | using System;
using System.Collections;
class Test
{
    public static void Main() 
    {
        ArrayList al = new ArrayList();
        al.Add( new Test() );
        al.Add( new Test() );
        Console.WriteLine("First Element is {0}", al[0]);
    }
} |  WriteLine metodunda .Items[0] 'ın kullanılmadığına dikkat edin.
 
 S - 23 : Herhangi bir fonksiyonumu "out int" parametresi alacak 
  şekilde tasarlmaya çalışıyorum. Bu metoda göndereceğim int değişkenini nasıl 
  bildirmeliyim?
 
 C - 23 : Değişken bildirimi int türünden yapmalısınız fakat bu değişkeni fonksiyona 
  parametre olarak gönderirken aşağıdaki gibi "out" anahtar sözcüğünü 
  de kullanmalısınız.
 
 
 
 
   
   
    | int i;
   foo(out i);
      foo 
      metodu aşağıdaki gibi bildirilmiştir.  
         [return-type] foo(out int o) { } |  
 S - 24 : C++'taki referanslara benzer bir yapı C#' ta varmıdır? (Ör : void 
  foo(int &x) gibi )
 
 C - 24 : C#'ta bunun karşılığı ref parametreleridir.
 
 
 
 
   
   
    | class Test
{
    public void foo(ref int i) 
    {
        i = 1;
    }
    public void bar() 
    {
        int a = 0;
        foo(ref a);
        if (a == 1)
            Console.WriteLine("It worked");
    }
    public static void Main() {}
} |  Not: Metot çağrımında da ref sözcüğünün kullanıldığına dikkat edin!
 
 S - 25 : C#'ta inout argümanları nasıl bildirilir?
 
 C - 25 : inout'un C# taki karşlığı ref'tir. Örneğin :
 
 
 
 
   
   
    | public void MyMethod (ref String str1, out String str2) 
{
    ...
} |  Bu metot aşağıdaki biçimde çağrılmalıdır.
 
 
 
   
   
    | String s1;
    String s2;
    s1 = "Hello";
    MyMethod(ref s1, out s2);
    Console.WriteLine(s1);
    Console.WriteLine(s2); |  Not : Hem metot çağrımı hemde metot bildirimi sırasında ref sözcüğünün kullanıldığına 
dikkat edin.
 
 S - 26 : Yıkıcı metotlar(destructors) ve GC C#'ta ne şekilde çalışır?
 
 C - 26 : C# ta sonlandırıcı metotlar vardır ve kullanımı aşağıdaki gibidir. 
  (Bu sonlandırıcı metotlar C++ taki yıkıcı metotlara benzer, tek farkı çağrılacağı 
  garanti altına alınmamıştır.)
 
 
 
 
 
   
   
    | class C
{
    ~C()
    {
        // your code
    }
    public static void Main() {}
} |  Bu metotlar object.Finalize() metodunu aşırı yüklerler ve GC nesneyi yok ederken 
bu metodu kullanır.
 
 S - 27 : Derleme sırasında neden "CS5001: does not have an entry point defined 
  - tanımlanmış giriş noktası yok- " hatasını alıyorum?
 
 C - 27 : Bu hata en çok Main metodunu main şeklinde yazdığınızda karşınıza çıkar. 
  Giriş noktası olan bu Main metodunun bildirimi aşağıdaki gibi olmalıdır :
 
 
 
 
 
   
   
    | class test 
{
    static void Main(string[] args) {}
} |  
 S - 28 : Visual J++ ta "synchronized" olarak bildrilen metotları C# diline 
  nasıl taşırım?
 
 C - 28 : Orjinal 
  Visual J++ kodu:
 
 
 
   
   
    | public synchronized void Run() 
{
    // function body
} |  C# diline taşınmış hali
 
 
 
   
   
    | class C
{
    public void Run()
    {
        lock(this)
        {
            // function body 
        }
    }
 
    public static void Main() {}
} |  
 
 S - 29 : Kanal(thread) senkronizasyonu(Object.Wait, Notift ve CriticalSection) 
C#'ta nasıl sağlanır?
 
 C - 29 : lock ile işaretlemiş bloklar bu işe yarar :
 
 
 kod parçasının karşılığı
 
 
 
   
   
    | try 
{
    CriticalSection.Enter(obj);
    // code
} 
finally 
{
    CriticalSection.Exit(obj);
} |  
 
 S - 30 : Statik yapıcı metotların sentaksı nasıldır?
 
 C - 30 : Aşağıda MyClass adlı sınıfın statik yapılandırıcısının bildirimi 
gösterilmiştir.
 
 
 
   
   
    | class MyClass
{
    static MyClass()
    {
        // initialize static variables here
    }
    public static void Main() {}
} |  
 
 
 S - 31 : Bir özelliğin get ve set bloklarını farklı erişim belirleyicileri 
ile bildirmek mümkünmüdür?
 
 C - 31 : Hayır, bir özelliğin belirtilen erişim belirleyicisi aynı zamanda hem 
get hem de set bloklarınınn erişim belirleyicisidir. Fakat yapmak istediğinizi 
muhtemelen sadece get bloğu olan yani readonly olarak bildirip set bloğunu private 
yada internal olan bir metot yapacak şekilde gerçekleştirebilirsiniz.
 
 
 
 S - 32 : Tek bir assembly de çoklu dil desteğini nasıl sağlayabilirim?
 
 C - 32 : Bu şu an için Visual Studio.NET tarafından desteklenen bir özellik değildir.
 
 
 
 S - 33 : C# dizi türünden olan özellikleri destekliyor mu?
 
 C - 33 : Evet, aşağıda buna bir örnek verilmiştir:
 
 
 
   
   
    | using System;
class Class1 
{
    private string[] MyField;
    public string[] MyProperty 
    {
        get { return MyField;  }
        set { MyField = value; }
    }
}
class MainClass
{
    public static int Main(string[] args) 
    {
        Class1 c = new Class1();
        string[] arr = new string[] {"apple", "banana"};
        c.MyProperty = arr;
        Console.WriteLine(c.MyProperty[0]);  // "apple"
    
        return 0;
    }
} |  
 
 
 S - 34 : Birden fazla assembly ile çoklu dil desteği sağlanabilirmi?
 
 C - 34 : Malesef şu an için IDE de bu desteklenmiyor. Bunu yapabilmek için komut 
satırından projenizi /target:module argümanı ile derleyip modüllere ayırmanız 
gerekir. Ve oluşturduğunuz bu modülleri birleştirmek için yine komut satırından 
al(alink) aracını çalıştırarak bu modüllerin birleştirilmesini sağlayın.
 
 
 
 S - 35 : COM nesnelerine erişmek için opsiyonel olan 
parametreleri nasıl simule edebilirim?
 
 C - 35 : Opsiyonel parametreler için System.Reflection altında bulunan Missing 
sınıfı kullanılır. Her bir parametre için Missing.Value değeri kullanılabilir.
 
 
 
 S - 36 : C++'taki varsayılan metot argümanlarının bir karşılığı C#'ta var 
mı?
 
 C - 36 : Varsayılan argüman desteği yoktur ancak aynı etkiyi metot yükleme ile 
rahatlıkla yapabilirsiniz.
 
 Bu problem için metot yüklemeyi tercih etmemizin sebebi ileriki zamanlarda kaynak 
kodu yeniden derlemeden varsayılan argümanı değiştirme imkanı vermesidir. C++ 
taki varsayılan argümanlar derşenmiş kodun içine gömüldüğü için sonradan bu argümanı 
kaynak kodu derlemeden değiştirmek mümkün değildir.
 
 
 
 S - 36 : İçiçe geçmiş bloklarda yada döngülerde hangi bloğun sonlandırdıldığını 
belirtmek için kolay bir yol varmıdır?
 
 C - 36 : Bu işin en kolay yolu goto atlama deyimini aşağıdaki gibi kullanmaktır.
 
 
 
   
   
    | using System;
class BreakExample 
{
    public static void Main(String[] args) 
    {
        for(int i=0; i<3; i++) 
        {
            Console.WriteLine("Pass {0}: ", i);
            for( int j=0 ; j<100 ; j++ ) 
            {
                if ( j == 10) goto done;
                Console.WriteLine("{0} ", j);
            }
            Console.WriteLine("This will not print");
        }
        done:
        Console.WriteLine("Loops complete.");
    }
} |  
 
 S - 37 : C#'ta deterministik sonlandırmayı nasıl 
sağlayabilirim.
 
 C - 37 : GC mekanizması gerçek anlamda deterministik yapıda değildir. Yani 
ne zaman gereksiz nesnelerin toplanacağı kesin olarak belilenmemiştir. Bu yüzden 
kritik kaynaklara sahip olan nesneleri tasarlamak için IDisposable arayüzünü uygulamış 
sınıflar tasarlamakta fayda vardır. Aşağıdaki tasarım deseni sınıf için ayrılan 
kaynağın blok sonunda bırakılacağını bildirmektedir.
 
 
 
   
  Akış, using bloğunun 
  sonuna geldiğinde myFile nesnesi üzerinden Dispose() metodu çağrılacaktır. Nesneleri 
  bu şekilde using ile kullanabilmek için ilgili sınıfın IDisposable arayüzünü 
  uygulaması gerektiğini unutmayın. 
    | using(FileStream myFile = File.Open(@"c:\temp\test.txt", FileMode.Open))
{
  int fileOffset = 0;
 
  while(fileOffset < myFile.Length)
  {
    Console.Write((char)myFile.ReadByte());
    fileOffset++;
  }
} |  
 
 
 S - 38 : C#'ta metotlar için değişken sayıda 
  argüman (vararg) desteği varmıdır?
 
 C - 38 : params anahtar sözcüğü bir metodun değişken sayıda parametre 
  alabileceğini belirtir. Metot bildiriminde params anahtar sözcüğünden sonra 
  herhangi bir metot parametresi bildirilemez. Ve bir metot için sadece bir tane 
  params anahtar sözcüğünün kullanımına izin verimiştir. Aşağıda params'ın kullanımıa 
  bir örnek verilmiştir.
 
 
 
 
 
   
   
    | using System;
public class MyClass 
{
   public static void UseParams(params int[] list) 
   {
      for ( int i = 0 ; i < list.Length ; i++ )
         Console.WriteLine(list[i]);
      Console.WriteLine();
   }
   public static void UseParams2(params object[] list) 
   {
      for ( int i = 0 ; i < list.Length ; i++ )
         Console.WriteLine((object)list[i]);
      Console.WriteLine();
   }
   public static void Main() 
   {
      UseParams(1, 2, 3);
      UseParams2(1, 'a', "test"); 
      int[] myarray = new int[3] {10,11,12};
      UseParams(myarray);
   }
} |  Çıktı
 
 
 
 
 S - 39 : C#'ta string türünden bir değişkeni int 
  türüne nasıl dönüştürebilirim?
 
 C - 39 : Aşağıda bu duruma bir örnek verilmiştir.
 
 
 
 
   
   
    | using System;
class StringToInt
{
    public static void Main()
    {
	String s = "105";
	int x = Convert.ToInt32(s);
	Console.WriteLine(x);
    }
} |  
 
 S - 40 : C# ile yazılmış uygulamalardan çıkmak 
  için exit() gibi bir fonksiyon varmıdır?
 
 C - 40 : Evet, uygulamadan çıkmak için System.Environment.Exit(int exitCode) 
  metodunu yada uygulamanız bir windows uygulaması ise Aplication.Exit() metotlarını 
  kullanabilirsiniz.
 
 
 
 S - 41 : Bütün assembly için özel bir nitelik nasıl 
  belirtilir?
 
 C - 41 : Global nitelikler en tepedeki using deyiminden sonra ve herhangi 
  bir sınıf yada isim alanı bildiriminden önce yapılmalıdır. Örnek :
 
 
 
 
 
   
   
    | using System;
    [assembly : MyAttributeClass]
    class X {} |  Not : IDE tarafından yaratılan projelerde bu nitelik bildirimleri AssemblyInfo.cs 
dosyasında yapılmıştır.
 
 S - 42 : C# ile yazılmış kodu klasik COM istemcilerinin 
  kullanımına sunmak için nasıl kayıt(register) etmeliyim?
 
 C - 42 : regasm aracını kullanarak eğer gerekliyse type library leri 
  oluşturun. Sınıf windows registery ye kayıt edildikten sonra bu sınıfa COM istemcileri 
  tarafından sanki bir COM bileşeniymiş gibi erişilebilir.
 
 
 
 S - 43 : Birden fazla derlenecek kaynak kod aynı 
  anda derlendiğinde, çalıştırılabilir dosyanın ismi nasıl belirleniyor?
 
 C - 43 : Çalıştırılabilir dosyanın adı Main metodunun bulunduğu kaynak 
  dosyanın adı ile aynı olur. Komut satırından /out argümanı ile çalıştırılabilir 
  dosyanın adını kendiniz de belirleyebilirsiniz. Örneğin:
 
 C:\ csc /out:Uygulama.exe dosya1.cs dosya2.cs
 
 komutu çalıştırılabilir dosyanın adını Uygulama.exe yapacaktır.
 
 
 
 
 S - 44 : C#'ta String türünden nesneler nasıl karşılaştırılır?
 
 C - 44 : Geçmişte iki stringi == ve != operatörleri ile karşılaştırmak 
  için ToString() metodu kullanılmalıydı. Şu anda ise yine bu yöntem geçerli olmasına 
  rağmen string ler == ve != operatörü ile karşılaştırıldıklarında değişkenlerin 
  referansları yerine onların değerleri karşılaştırılır.
 
 Eğer gerçekten string değişkenlerinin referanslarını karşılaştırmak istersek 
  aşağıdaki kodu kullanabiliriz.
 
 
 
   
  Aşağıda string 
  değişkenlerinin nasıl çalıştığına bir örnek verilmiştir. 
    | if ((object) str1 == (object) str2) { ... } |  
 
 
   
   
    | using System;
public class StringTest
{
   public static void Main(string[] args)
   {
      Object nullObj = null;
      Object realObj = new StringTest();
      int i = 10;
	
      Console.WriteLine("Null Object is [" + nullObj + "]\n" +
                        "Real Object is [" + realObj + "]\n" +
                        "i is [" + i + "]\n");		
      
      // Show string equality operators
      string str1 = "foo";
      string str2 = "bar";
      string str3 = "bar";
      Console.WriteLine("{0} == {1} ? {2}", str1, str2, str1 == str2 );
      Console.WriteLine("{0} == {1} ? {2}", str2, str3, str2 == str3 );
   }
} |  Çıktı
 
 
   
   
    | Null Object is []
Real Object is [StringTest]
i is [10]
foo == bar ? False
bar == bar ? True |  
 
 S - 45 : C++'taki typedef komutunun yaptığı gibi 
farklı türler için takma isimleri kullanılabilirmi?
 
 C - 45 : Tam olarak değil ama bir dosyada using deyimini aşağıdaki gibi 
kullanarak herhangi bir türe takma isim verebilirsiniz.
 
 
 
   
  using deyiminin 
  kullanımı hakkında ayrıntılı bilgi için C# standartlarını incelyin. 
    | using System;
using Integer = System.Int32; // takma isimi |  
 
 
 S - 46 : C#'ta sınıf ile yapı arasındaki farklar 
  nelerdir?
 
 C - 46 : Sınıflar ve yapılar arasındaki farkların listesi oldukça fazladır. 
  Yapılar sınıflar gibi arayüzleri uygulayabilir ve aynı üye elemanlara sahip 
  olabilirler. Yapılar, sınıflardan bir çok önemli noktada ayrılır; yapılar değer 
  tipleri sınıflar ise referans tipleridir ve türetme yapılar için desteklenmez. 
  Yapılar stack bellek bölgesinde saklanır. Dikkatli programcılar bazen yapıları 
  kullanarak uygulamanın performansını artırabilirler. Mesela Point yapısı için 
  sınıf yerine yapı kullanmak çalışma zamanında tahsis edilen bellek açısından 
  oldukça faydalıdır.
 
 
 
 S - 47 : Bir karakterin ASCII kodunu nasıl elde 
  edebilirim?
 
 C - 47 : char türden değişkeni int türüne dönüştürürseniz karakterin 
  ASCII kodunu elde edersiniz.
 
 
 
   
   
    | char c = 'f';
System.Console.WriteLine((int)c); |  yada bir string deki herhangi bir karakter için
 
 
 
   
   
    | System.Console.WriteLine((int)s[3]); |  kodunu kullanabilirsiniz.
 .NET kütüphanesindeki 
  Convert ve Encoding sınıflarının yardımıylada bu işlemi gerçekleştirmek mümkündür.
 
 
 
 
 S - 48 : Versiyonlama bakış açısıyla arayüz türetmenin 
  sınıf türetmeye karşı getirileri nelerdir?
 
 C - 48 : Versiyonlama bakış açısıyla arayüz türetmenin sınıf türetmesine 
  göre daha az esenek olduğunu söylemek mümkündür.
 
 Sınıflarda farklı versiyonlara yeni üye elemanlar örneğin yeni metot eklemeniz 
  mümkündür. Bu metot abstract olmadığı sürece yeni türetilen sınıflar bu metodun 
  fonksiyonalitesine sahip olacaktır. Arayüzler uygulanmış kodların türetilmesini 
  desteklemediği için bu durum arayüzler için geçerli değildir. Bir arayüze yeni 
  bir metot eklemek sınıflara yeni bir abstract metot gibidir. Bu arayüzü uygulayan 
  bir sınıf bu metodu aynen uygulayıp kendine göre anlamlandırmalıdır.
 
 
 
 
 S - 49 : C# koduna inline assembly yada IL kodu 
  yazmak mümkünmüdür?
 
 C - 49 : Hayır.
 
 
 
 S - 50 : Bir metodu yada herhangi bir üye elemanının 
  kullanımını sadece belirli bir isim alanı için sınırlayabilirmiyiz?
 
 C - 50 : İsim alanları için bir kısılama yapılamaz çünkü isim alanları 
  koruma amaçlı olarak kullanılmamaktadır ancak internal erişim belirleyicisi 
  ile bir türün sadece ilgili aseembly dosyası içinde kullanılabilecek durumuna 
  getirebiliriz.
 
 
 
 S - 51 : try bloğu içerisinde return ile metodu 
  sonlandırısam finally bloğundaki kodlar çalıştırılır mı?
 
 C - 51 : Evet, finally bloğundaki kodlar siz return ile metodu sonlandırsanızda 
  try bloğunun sonuna gelsenizde her zaman çalışacaktır. Örneğin :
 
 
 
 
   
  programında hem 
  "In try block" hemde "In Finally block" yazıs ekrana yazdırılacaktır. 
  Performans açısından return sözcüğünü try bloğunda yada finally bloğundan sonra 
  kullanmanın bir farkı yoktur. Derleyici yukarıdaki durumda return ifadesinin 
  sanki finally bloğunun dışındaymış gibi davranır. Eğer yukarıda olduğu gibi 
  return deyimi herhangi bir ifade ile kullanılmıyorsa her iki durumdada IL olarak 
  üretilen kodlar aynıdır. Fakat eğer return deyimi bir ifade ile kullanılıyorsa 
  try bloğundaki return ifadesinde ekstradan store ve load deyimlerinin IL de 
  olacağı açıktır. 
    | using System;
class main 
{
    public static void Main() 
    {
        try 
        {
            Console.WriteLine("In Try block");
            return;
        }
        finally 
        {
            Console.WriteLine("In Finally block");
        }
    }
} |  
 
 
 
 S - 52 : C# try-catch-finally vloklarını destekliyormu?
 
 C - 52 : Evet destekliyor, aşağıda bu blokların kullanımına bir örnek 
  verilmiştir.
 
 
 
 
   
   
    | using System;
public class TryTest
{
   static void Main()
   {
      try
      {
         Console.WriteLine("In Try block");
	 throw new ArgumentException();
      }
      catch(ArgumentException n1)
      {
	 Console.WriteLine("Catch Block");
      }
      finally
      {
	 Console.WriteLine("Finally Block");
      }
   }
} |  Çıktı
 
 
   
   
    | In Try Block
Catch Block
Finally Block |  
 
 S - 53 : Statik indeksleyici tanımlamak mümkünmüdür?
 
 C - 53 : Hayır. Statik indeksleyici tanımalamaya izin verilmemiştir.
 
 
 
 
 S - 54 : Derleyiciyi /optimize+ argümanı ile çalıştırdığımızda 
  ne gibi optimizasyonlar yapar.
 
 C - 54 : C# derleyicisini yazan takının bu soruya verdiği cevap:
 
 Kullanılmayan lokal değişkenleri atıyoruz. (örnek, hiç okunmayan lokal değişkenler 
  - kendisine değer verilmiş olsa bile-).
 Hiç bir şekilde erişilemyecek(unreachable) kodları atıyoruz.
 try bloğu boş olan try/catch bloklarını kaldırıyoruz.
 try bloğu boş olan try/finally bloklarını kaldırıyoruz.(normal koda çevrlir)
 finally bloğu boş olan try/finally bloklarını kaldırıyoruz.(normal koda çevrlir)
 Dallanmalarda diğer dallanmaları optimize ediyoruz. Örneğin
 
 
 
   
   
    | gotoif A, lab1
 goto lab2:
 lab1: |  kodu
 
 
 koduna dönüştürülür.
 We optimize branches 
  to ret, branches to next instruction, branches to branches. Dallanmaları "ret"'e, 
  "next instruction" lara veya diğer "branch" lara dönüştürüyoruz.
 
 
 
 
 S - 55 : C# ile registry'ye nasıl erişebilirim?
 
 C - 55 : Microsoft.Win32 isim alanındaki Registry ve Registry sınıflarını 
  kullanarak bu alana erişmek mümkündür. Aşağıdaki program bir registry anahtarını 
  okuyup değerini yazdırmaktadır.
 
 
 
 
   
   
    | using System;
using Microsoft.Win32;
class regTest
{
    public static void Main(String[] args)
    {
        RegistryKey regKey;
        Object value;
        regKey = Registry.LocalMachine;
        regKey = regKey.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");
        value = regKey.GetValue("VendorIdentifier");
        Console.WriteLine("The central processor of this machine is: {0}.", value);
    }
} |  
 
 S - 56 : C# global sabitleri tanımlamak için #define 
  komutunu destekler mi?
 
 C - 56 : Hayır. Eğer C dilindeki aşağıdaki koda benzer bir kullanım elde 
  etmek istiyorsanız
 
 
 bu kodu kullanabilirsiniz.
 
 
 
   
   
    | class MyConstants
{
   public const int A = 1;
} |  Böylece A makrosuna her erişmek istediğinizde MyConstants.A şeklinde bir kullanıma 
sahip olursunuz.
 MyConstants.A şeklindeki 
  kullanım ile 1 sayısının kullanımı arasında bir fark yoktur. Yani aynı kod üretilecektir.
 
 
 
 
 S - 57 : Yeni bir proses çalıştırıp bu proesisin 
  sonlanmasını nasıl bekleyebilirim?
 
 C - 57 : Aşağıdaki kod argüman olarak verilen çalıştırılabilir programı 
  çalıştırı ve çalışan bu programın kapatılması için bekler.
 
 
 
 
 
   
   
    | using System;
using System.Diagnostics;
public class ProcessTest {
    public static void Main(string[] args) {
        Process p = Process.Start(args[0]);
        p.WaitForExit();
        Console.WriteLine(args[0] + " exited.");
    }
} |  
 
 S - 58: Bir metot obsolete olarak asıl işaretlenir?
 
 C - 58 : using System; yazdığınızı varsayarak
 
 
 
   
   
    | [Obsolete]
public int Foo() {...} |  yada
 
 
 
   
  Not: Obsolete kelimesindeki 
  O harfi büyüktür. 
    | [Obsolete("Bu mesaj metodun neden Obsolete olduğunu açıklar.")]
public int Foo() {...} |  
 
 
 
 S - 59: using deyimini kaynak koduma eklememe rağmen 
  derleyici tanımlanmamış türlerin bulunduğunu söylüyor. Nerede yanlış yapıyorum 
  acaba?
 
 C - 59 : Büyük bir ihtimalle isim alanının bulunfuğu assembly dosyasını 
  referans vermeyi unutmuşsunuzdur. using deyimi sadece bir sentaksdır. Assembly 
  nin fiziksel olarak konumunu da ayrıca belirtmeniz gerekir. IDE yi kullanarak 
  project menüsünden add reference seöeneği seçip istediğiniz assembly ye referans 
  verebilirsiniz. Komut satırı derleyicisi kullanıyorsanız /r argümanını kullanmalısınız.
 
 
 
 S - 60 : Basit bir çok kanallı uygulama için örnek 
  kod var mı?
 
 C - 60 : Evet. örnek :
 
 
 
 
 
   
   
    | using System;
using System.Threading;
 
class ThreadTest 
{
    public void  runme() 
    {
        Console.WriteLine("Runme Called");
    }  
 
    public static void Main(String[] args) 
    {
        ThreadTest b = new ThreadTest();
        Thread t = new Thread(new ThreadStart(b.runme));
        t.Start();
    }
} |  
 
 S - 61: Override edilmiş bir metodun temel sınıftaki 
  versiyonunu nasıl çağırabilirim?
 
 C - 61 : Aşağıdaki gibi base anahtar sözcüğünün kullanarak çağırabilirsiniz.
 
 
 
 
 
   
   
    | public class MyBase
{
    public virtual void meth()
    {
        System.Console.WriteLine("Test");
    }
}
public class MyDerived : MyBase
{
    public override void meth()
    {
        System.Console.WriteLine("Test2");
        base.meth();
    }
    public static void Main()
    {
        MyDerived md = new MyDerived();
        md.meth();
    }
} |  
 
 S - 62: C# geliştiricilerini düzenli ifadeler(regex) 
  desteği sunulmuşmudur?
 
 C - 62 : Evet, .NET sınıf kütüphanesi programcılara düzenli ifadelerle 
  çalışmak için System.Text.RegularExpressions isim alanında bir takım sınıflar 
  sağlamaktadır.
 
 
 
 S - 63 :  C# ile yazmış olduğum uygulamayı çalıştırdığımda 
  neden güvenlik hatası alıyorum?
 
 C - 63 : Bazı güvenlik hataları ağ üzerinde paylaşıma açılmış kaynaklar 
  üzerinde çalışırken alnır. Roaming profilleri, mapped diskler gibi kaynaklar 
  üzerinde çalışmayan bazı sınıflar vardır. Bunun olup olmadığını kontrol etmek 
  için uygulamanızı lokal diskinize alıp yeniden çalıştırmayı deneyin.
 
 Bu tür durumlarda genellikle System.Security.SecurityException istisnai durumu 
  meydana gelir.
 
 Bu tür sorunların üstesinden gelmek için caspol.exe aracı yardımıyla intranet 
  için güvenlik policy nizi codegroup 1.2 ye ayarlayabilirsiniz.
 
 
 
 
 S - 64: try-catch bloklarında faaliyet alanı (scope) 
  problemlerinin üstesinden nasıl gelirim?
 
 C - 64 : try bloğu içinde yarattığınız nesneye catch bloğu içinden erişemezsiniz 
  çünkü try bloğunun sonunda ilgili nesnenin faaliyet alanı bitecektir. Bunun 
  önüne geçmek için aşağıdaki kod bloğu kullanılabilir.
 
 
 
 
 
   
   
    | Connection conn = null;
try 
{
    conn = new Connection();
    conn.Open();
}
finally
{ 
    if (conn != null) conn.Close(); 
} |  
 try bloğundan önde değişkeni null değere atamakla derleyicinin CS0165 (Use of 
possibly unassigned local variable 'conn' ) hatasını vermesini engellemiş oluruz.
 
 S - 65: .NET geliştirme ortamında regsvr32 ve regsvr32 
  /u komutlarının karşılığı nedir?
 
 C - 65 : RegAsm aracını kullanabilirsiniz. .NET SDK içinde bu aracın 
  kullanımı hakkında detaylı bilgiyi bulmanız mümkündür.
 
 
 
 
 S - 65: C#, parametreleri özellikleri destekliyor 
  mu?
 
 C - 65 : Hayır, fakat dilin temel yapısında indeksleyici diye ayrı bir 
  kavram vardır.
 
 Bir indeksleyici bir türün dizi gibi indek operatörü ile kullanılabilmesini 
  sağlar.Kısaca özellikler field benzeri erişimi indeskleyiciler ise dizi benzeri 
  erişimi sağlarlar.
 
 Örnek olması açısından daha önce yazdığımız Stack sınıfını düşünün. Bu sınıfı 
  tasarlayan sınıfın üye elemanlarına bir dizi gibi erişilmesini isteyebilir ve 
  böylece gereksiz Pop ve Push çağrımları yapılmamış olur. Yani stack bir bağlı 
  liste gibi tasarlanmış olmasına rağmen bir dizi gibi kullanılabilmektedir.
 
 İndeksleyici bildirimi özellik bildirimine benzemektedir. İki bildirim arasındaki 
  en büyük fark indeksleyicilerin isimlerinin olmamasıdır.(indeskleyici bildiriminde 
  isi yerine this anahtar sözcüğü kullanılır.) Diğer bir fark ise indekleyicilerin 
  indeks parametresi alabilmesidir. Bu indeks parametresi köşeli parantezler içinde 
  yazılır.
 
 
 
                Makale:C# ile İlgili Sık Sorulan Sorular (SSS) C#, Visual C# ve .NET Sefer Algan
 |  
            |  |  
            |  |  
            | 
                    
                        
                            
                        
                            Eklenen Son 10 
                            Bu Konuda Geçmiş 10 
                        
                            Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
                         
                            Son Eklenen 10 Makale Yükleniyor
                         
                            Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
                         |  
            |  |  |