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.
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;
}
|
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!)
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.
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() {}
}
|
S – 8 : C#’ta Visual J++ ta bulunan instanceof operatörünün karşılığı varmıdır?
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 :
lock(obj)
{
   // code
}
|
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.
 using(FileStream myFile = File.Open(@"c:\temp\test.txt", FileMode.Open))
{
 int fileOffset = 0;
  while(fileOffset < myFile.Length)
 {
   Console.Write((char)myFile.ReadByte());
   fileOffset++;
 }
}Â Â Â Â Â Â Â Â Â Â
|
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.
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ı
1
2
3
Â
1
a
test
Â
10
11
12
|
Â
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.
 if ((object) str1 == (object) str2) { ... }
|
Aşağıda string değişkenlerinin nasıl çalıştığına bir örnek verilmiştir.
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 System;
using Integer = System.Int32; // takma isimi
|
using deyiminin kullanımı hakkında ayrıntılı bilgi için C# standartlarını incelyin.
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 :
using System;
class main
{
   public static void Main()
    {
       try
        {
           Console.WriteLine("In Try block");
           return;
       }
       finally
        {
           Console.WriteLine("In Finally block");
       }
   }
}
|
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.
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
[Obsolete("Bu mesaj metodun neden Obsolete olduğunu açıklar.")]
public int Foo() {...}
|
Not: Obsolete kelimesindeki O harfi büyüktür.
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.
Yorumlar
Yorum Yok
Yorumunuzu Ekleyin
Yorum eklemek için giris yapmalısınız.