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.
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 :
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ı
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.
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
|
|
|