Başlangıç > C# > c# ile ilgili sık sorulan sorular(sss)

c# ile ilgili sık sorulan sorular(sss)


 

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

gotoif !A, lab2

lab1:

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\”);

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

#define A 1

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.

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.

 

Reklamlar
Kategoriler:C# Etiketler:, , , ,
  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: