C# Değişkenlerini ve Veri Türlerini Anlama
[[academy-video-youtube({"vid": "UntC0hoeGAQ", "start_time": "0", "title": "C# Degişkenleri ve Veri Türlerini Anlama", "creator": "Tim Corey", "length": "28m 27s"})]]
C# programlamasında, değişkenler veri değerlerini depolayan temel unsurlardır. Değişkenlerin etkili bir şekilde nasıl tanımlanacağı ve kullanılacağının anlaşılması, verimli ve bakımı kolay kod yazmak için önemlidir. Temel veri türleri, sabitler ve dinamik türü belirlenmiş değişkenler gibi farklı türlerde değişkenler olabilir, her biri özel amaçlarına hizmet eder. Ayrıca, tür dönüşümü, dinamik kelimeleri ve var anahtar kelimeleri C# programlamasına esneklik ve sağlamlık kazandırır.
Tim Corey'nin 'C#'ta Dinamik vs Var' videosu bu kavramların genel bir görünümünü sağlar. Bu makalede, Tim tarafından ele alınan birkaç konuya göz atacağız:
- Dinamik ve Var Arasındaki Fark
- Temel Veri Türleri
- Değişkenler ve Sabitler
- Dinamik Otomatik Tür Dönüşümü
- Geliştirmede Dinamik Kullanımının Dezavantajları
- Dinamik Ne Zaman ve Neden Kullanılır
- Var Ne Zaman ve Neden Kullanılır
C#'ta değişkenlerin nasıl yönetileceği ve etkin şekilde kullanılacağı konusunda daha derin bir kavrayış elde edeceksiniz.
Dinamik ve Var Arasındaki Fark
C#'ta, var, derleme zamanında tür güvenliği ve IntelliSense desteği sağlayarak, türün derleme zamanında belirlendiği örtük türde yerel değişkenler için kullanılır. Buna karşılık, dynamic, değişkenlerin derleme zamanı tür denetimini atlamasına izin verir, tür çalıştırma zamanında çözülür, daha fazla esneklik sunar ama çalışma zamanı hataları ve performans sorunları riski taşır.
Tim Corey, var'nin statik değişkenler olduğu için derleme zamanında tür belirlemesi ile tür güvenliğini sağladığını, dynamic'nın ise çalışma zamanı tür çözümü ile esneklik sunduğunu ancak çalışma zamanı hatalarına ve performans sorunlarına yol açabileceğini açıklar.
Temel Veri Türleri
Tim, Visual Studio'da C#'taki temel veri türlerini tanıtarak gösterimini başlatır. O, dynamic adında bir testDynamic nesnesi oluşturur, bu nesne herhangi bir anda yeni bir değer alabilir ve veri türü çalıştırma zamanında dinamik olarak değişebilir. Bunu şu kod ile gösterir:
// Declaration of a dynamic variable that can change types at runtime
dynamic testDynamic;// Declaration of a dynamic variable that can change types at runtime
dynamic testDynamic;C#, çeşitli türdeki verileri işlemek için birkaç temel veri türü sağlar. Tam sayı türleri, 32-bit işaretli tam sayılar için int, 64-bit işaretli tam sayılar için long, 16-bit işaretli tam sayılar için short ve 8-bit işaretsiz tam sayılar için byte içerir. Ondalık sayılar için, C# tek hassasiyetli 32-bit değerler için float, çift hassasiyetli 64-bit değerler için double ve finansal hesaplamalar için ideal olan 128-bit hassas ondalık değerler için decimal sunar. char veri türü 16-bit Unicode karakterleri temsil ederken, bool türü doğru veya yanlış değerler için kullanılır. Ayrıca, string veri türü bir karakter dizisini temsil eder ve metin depolama ve manipülasyonu sağlar.
Bu veri türleri C# programlamasında temel olup, Tim'in ilerleyen örneklerinde gösterdiği gibi verimli veri depolama ve manipülasyonuna imkan verir. Birden fazla değişken, tek satırda int tamsayı türleri olarak ilan edilebilir ve başlangıçta açıkça bir değer atanmadıysa, her veri türünün bir varsayılan değeri vardır. Sabit değişkenler, kod boyunca tutarlılığı sağlarak sabit değerler barındırır. Ayrıca örnek değişkenler ve statik değişkenler de bu veri türleri kullanılarak beyan edilebilir, sağlam ve esnek program yapıları sağlar.
Değişkenler ve Sabitler
Tim Corey, 1:21'de, başlangıçta atama yapılmadan int adında bir var nesnesi oluşturmaya çalışır, bu da derleme zamanında bir hataya neden olur çünkü var, türünü çıkarsamak için ilk bir atama gerektirir:
// This will result in a compile-time error due to lack of type inference
// var testVar;// This will result in a compile-time error due to lack of type inference
// var testVar;Bu, testVar'nin altında bir kırmızı dalgalı çizgi ile sonuçlanır, hata gösterir. 1:55'te Tim, var'nin ilan edildiği anda bir tür atanması gerektiğini açıklar. Örneğin:
// var assignment with type inference from the initial value
var testVar = 2; // testVar is inferred to be of type int// var assignment with type inference from the initial value
var testVar = 2; // testVar is inferred to be of type intTim (2:44), eğer daha sonra testVar'ya çift bir değer atamaya çalıştığında bunun bir hataya neden olduğunu çünkü testVar başlangıçta int olarak atandığını gösterir:
// Attempting to change the type from int to double causes an error
// testVar = 1.1; // Error: Cannot implicitly convert type 'double' to 'int'// Attempting to change the type from int to double causes an error
// testVar = 1.1; // Error: Cannot implicitly convert type 'double' to 'int'Tim (3:17) vurur ki var'nın türü ilk atama zamanı belirlenir ve daha sonra değiştirilemez. Eğer testVar başlangıçta çift bir değer atanırsa, çift olarak çıkarsanacaktır:
// Another example with dynamic typing
var testVar = 2.1; // Now testVar is a double// Another example with dynamic typing
var testVar = 2.1; // Now testVar is a doubleTim sabit değişkenlerle ilgili konuşmasa da, bunlar C# programlarında eşit derecede önemlidir. C#'ta sabitler, sabit değişkenin veri türü ve tanımlayıcısı ile const anahtar kelimesi kullanılarak ilan edilir, şu şekilde:
// Declaring a constant variable
const int MaxValue = 100;// Declaring a constant variable
const int MaxValue = 100;Sabitler, programın çalışması sırasında değiştirilemeyecek bir değerle beyan edilmelidir, bu, program mantığına değişmez değerler sağlar.
Dinamik Otomatik Tür Dönüşümü
Tim, dynamic anahtar kelimesinin, biraz object gibi davranarak, ancak ek yeteneklerle esnek tür işleme sağladığını vurgular. 3:53'te Tim, dynamic'nın, farklı türler arasında çalışma zamanı sırasında sorunsuz bir şekilde dönüştürebildiğini, örnek kodunda gösterildiği gibi, tam sayılar ve çiftlerle ilgili hesaplamaları açık cast etmeden gerçekleştirebildiğini gösterir.
// Demonstrating dynamic type conversion at runtime
dynamic testDynamic = 1;
testDynamic = testDynamic + 2.1;
Console.WriteLine(testDynamic); // Outputs 3.1 as it converts the integer to a double// Demonstrating dynamic type conversion at runtime
dynamic testDynamic = 1;
testDynamic = testDynamic + 2.1;
Console.WriteLine(testDynamic); // Outputs 3.1 as it converts the integer to a doubleBurada, Tim (4:39), testDynamic'nın başlangıçta bir tam sayı değeri tuttuğunu ancak 2.1 ekleyince çift bir değere dönüştüğünü ve sonuçta 3.1 çıktığını belirtir.
Esnekliğine rağmen, Tim, sık tür dönüşümleri nedeniyle dynamic'nın aşırı kullanılmasına karşı uyarır. 5:55'te dynamic'nın C# geliştirmesinde gereksiz işlemci yükünü ve sağlam, hatasız kod tabanlarını sürdürmek için kritik olan derleme zamanı tür denetimi ve IntelliSense desteğinin kaybını önlemek için dikkatli kullanılmasına vurgu yapar.
Geliştirmedeki Dinamiklerin Dezavantajları
Tim Corey, dynamic'nın, uygulamalarınızda çalışma zamanı hatalarına ve beklenmeyen davranışlara yol açabileceğini gösterir. Başlangıçta bir dinamik değişken tanımlayıp atayarak ve anında bir hata oluşmamasını sağlamak için boş bir dize atayarak başlar. Ardından, dinamik değişken üzerinde var olmayan metod sayHi'ı çağırmaya çalışır, bu derleme zamanında bir hataya neden olmaz ancak çalışma zamanı istisnası ile sonuçlanır, bu da dynamic'nın önemli bir dezavantajını gösterir: derleme zamanı denetiminin eksikliği.
// Demonstrating lack of compile-time checks with dynamic
dynamic testDynamic = "";
// testDynamic.sayHi(); // Runtime error: method does not exist// Demonstrating lack of compile-time checks with dynamic
dynamic testDynamic = "";
// testDynamic.sayHi(); // Runtime error: method does not exist8:38'de Tim, dinamik değişkenlerin çalışma zamanında tür değiştirebileceğini, bu da beklenmeyen davranışlara neden olabileceğini gösterir. O, dinamik bir değişkene bir Person nesnesi atar, ardından onu bir metin dizesine yeniden atar ve bu esnekliğin mantıksal hatalara yol açabileceğini ve hata ayıklamayı zorlaştırabileceğini gösterir.
// Demonstrating the potential errors with dynamic type reassignment
dynamic testDynamic = new Person();
testDynamic = "Hi";
Console.WriteLine(testDynamic); // Works fine, but not ideal for type safety// Demonstrating the potential errors with dynamic type reassignment
dynamic testDynamic = new Person();
testDynamic = "Hi";
Console.WriteLine(testDynamic); // Works fine, but not ideal for type safetyTim ayrıca, dinamik değişkenlerin yazım hataları veya yanlış metod adları nedeniyle çalışma zamanı hatalarına yol açabilecek IntelliSense desteğinden yoksun olduğunu açıklar. Örneğin, 14:05'te, var olmayan bir özellik Email adını çağırır, bu hatanın çalışma zamanına kadar fark edilmediğini vurgular. Kod hatasız bir şekilde derlenir, ancak çalışma zamanında Person nesnesinde beklenen yöntemler veya özellikler dizede bulunamadığında başarısız olur.
// Demonstrating a runtime error due to missing property
// testDynamic.Email = "Test@test.com"; // property not found until runtime// Demonstrating a runtime error due to missing property
// testDynamic.Email = "Test@test.com"; // property not found until runtimeVar Anahtar Kelimesini Kullanmanın Avantajı
Buna karşılık, var güçlü derecede türlendirilmiştir ve derleme zamanı tür denetimi ve IntelliSense desteği sağlar. Bu, geliştirme sırasında türle ilgili tüm sorunların yakalanmasını sağlarken, kodun daha güvenilir ve daha kolay bakımı yapılabilir olmasını sağlar. Tim Corey, bir var değişkeni oluşturarak ve ona bir Person nesnesi atayarak bunu gösterir:
// Using var for strongly-typed assignments
var testVar = new Person();
testVar.FirstName = "Sue";
testVar.LastName = "Storm";
// The use of IntelliSense assists in reducing runtime errors
Console.WriteLine(testVar.SayHello()); // Ideally a method in Person class// Using var for strongly-typed assignments
var testVar = new Person();
testVar.FirstName = "Sue";
testVar.LastName = "Storm";
// The use of IntelliSense assists in reducing runtime errors
Console.WriteLine(testVar.SayHello()); // Ideally a method in Person classVar olmayan bir yöntemi çağırmaya veya var değişkenini farklı bir türe yeniden atamaya çalışmak, derleme zamanında yakalanacak, potansiyel çalışma zamanı hatalarını önleyecektir.
// Attempting to change type results in compile-time errors with var
// testVar = "Hi"; // Compile-time error// Attempting to change type results in compile-time errors with var
// testVar = "Hi"; // Compile-time errorYöntem Dönüş Türü
15:05'te Tim, bir yöntemden dynamic türü döndürebileceğinizi, ancak bir var döndüremeyeceğinizi gösterir. Örneğin:
// Method returning a dynamic type
public dynamic GetMessage() {
return "This is a test";
}// Method returning a dynamic type
public dynamic GetMessage() {
return "This is a test";
}var döndürmeye çalışmak, derleme zamanı hatası ile sonuçlanır çünkü yöntem imzası somut bir dönüş türü belirtmelidir.
Dinamiğin Neden ve Ne Zaman Kullanılacağı
Tim, dynamic'nın vazgeçilmez olduğu belirli senaryoları detaylı olarak açıklar. C#'ın temelinde, her değişkenin yaşam döngüsü boyunca tutarlı kalan kesin bir tür atanmış olan, güçlü tipli bir dil olduğunu açıklar. Bu, değişkenlerin dinamik olarak tür değiştirebileceği JavaScript gibi dillere karşıttır.
Tim, 18:14'de, C#'ın güçlü tipli değişkenler için tasarlanmış olmasına rağmen, özellikle Python, Ruby veya COM objeleri gibi dil ve dış sistemlerle etkileşimlerde dinamik türlemenin faydalı olabileceğini belirtir. O, dynamic'nın pratik ihtiyacını vurgulamak için bir Python API entegrasyonu örneği kullanır. Bu durumlarda, dış kaynaklardan gelen çeşitli veri türlerine adapte olabilen esnek bir tür sistemi, etkileşimi basitleştirir.
Tim Corey, 18:44'te, dynamic'nın dil arası etkileşimler için kullanışlı olduğunu, ancak derleme zamanı hata denetimi ve IntelliSense desteğinin kaybı nedeniyle yalnızca C# kodu için genellikle önerilmediğini vurgular. O, dynamic'nın esnekliğinin performans ve tür güvenliği maliyetine geldiğini, güçlü türlendirilmiş değişkenlerin tercih edilmesi gereken düzenli C# programlaması için daha az istenen bir seçenek yaptığını uyarır.
Var Anahtar Kelimesinin Neden ve Ne Zaman Kullanılacağı
Tim ardından C#'ta var anahtar kelimesinin kullanımı ve felsefesini tartışır. O, var'yı kullanma konusunda iki ana kamp olduğunu belirtir: bunu yalnızca kullanmayı tercih edenler ve açık tür ilanlarını tercih edenler.
Tim, 19:43'te, var savunucularının daha iyi adlandırma kuralları teşvik ettiğini ve kodu kendiliğinden belgeler hale getirdiğini savunduğunu açıklar. Değişken adlarının, türü, uygun bir beyan olmadan aktarmak için yeterince açıklayıcı olması gerektiğine inanırlar.
Diğer tarafta (20:46), açık tür beyanlarını tercih edenler, gerçek türün doğrudan kodda görülmesinin, değişkenin türünü görmek için üzerine gelmeden, yerel değişkenin ne türde olduğunu anında açık hale getirdiğini savunuyor. Örneğin:
// Explicit type declaration provides clarity
string firstName = "Tim";// Explicit type declaration provides clarity
string firstName = "Tim";Bu bazıları tarafından tercih edilir çünkü değişkenin türü hakkında herhangi bir belirsizliği ortadan kaldırır.
Tim, 21:15'te, genellikle string, int, double ve decimal gibi yaygın veri türleri için açık türleri kullandığını çünkü bu şekilde kodun daha net olduğu ve double ile decimal karıştırılması gibi potansiyel sorunlardan kaçınıldığını belirterek dengeli yaklaşımını paylaşır. Örneğin:
// Explicit type ensures there's no ambiguity between float types
double myMoney = 1.1; // This is a double
decimal myMoney = 1.1M; // This is a decimal// Explicit type ensures there's no ambiguity between float types
double myMoney = 1.1; // This is a double
decimal myMoney = 1.1M; // This is a decimalTim, benzer türler arasında karışıklık olduğunda, doğru türün kullanıldığını garanti etmek için türü açıkça bildirmenin önemli olduğunu vurgular.
Ancak, Tim var'nın uzun veya karmaşık türlerle uğraşırken özellikle yararlı olabileceğini de kabul eder. 23:37'de bir List<List<Person>> bilgisini açıklar.
// Declaring a complex type using var
var rounds = new List<List<Person>>();// Declaring a complex type using var
var rounds = new List<List<Person>>();Ayrıca 23:55'te foreach döngülerinde faydasını gösterir:
// Utilizing var in loop for cleaner code
foreach (var round in rounds) {
// Do something with each round
}// Utilizing var in loop for cleaner code
foreach (var round in rounds) {
// Do something with each round
}Tim, var'nın belirginliği azaltabileceğini, ancak okunabilirliği korumak ve kafa karışıklığını önlemek için değişken adının net ve açıklayıcı olmasının önemli olduğunu belirterek sonuç çıkarır.
Açık türlerle @--CODE-370--@@ kullanarak, geliştiriciler açık, sürdürülebilir ve verimli kod yazabilir, her iki yaklaşımın güçlü yönlerini uygun bağlama göre kullanabilirler.
Anonim Nesne Olarak Var
Tim, türün açıkça bilinmediği veya anonim türlerle çalışıldığında var kullanımını tartışır. Tanımlanmış bir türü olmayan bir anonim nesne oluşturarak bunu gösterir. İşte kullandığı kod:
// Creating an anonymous object with var
var myItem = new { FirstName = "Tim", Email = "test@test.com" };// Creating an anonymous object with var
var myItem = new { FirstName = "Tim", Email = "test@test.com" };Tim, 25:30'da, bu nesne anonim olduğu ve belirli bir tür adı olmadığı için, bunun için değişkenlerin yalnızca var kullanılarak ilan edilebileceğini açıklar. Bu yaklaşım, formel bir sınıf tanımlamaya gerek kalmadan nesnelerin oluşturulmasına ve kullanılmasına izin verir.
Tim, bunun çalışmasını pratikte nasıl çalıştığını göstermek için şunları yazar (25:52):
// Outputting properties of an anonymous object
Console.WriteLine($"Hello {myItem.FirstName}: your email is {myItem.Email}");// Outputting properties of an anonymous object
Console.WriteLine($"Hello {myItem.FirstName}: your email is {myItem.Email}");Kod yürütüldüğünde 26:25'te çıktı şudur:
Bu, var'nın bir anonim nesnenin özelliklerini ele alabileceğini ve Visual Studio'nun bu özellikler için IntelliSense desteği sağladığını, nesne anonim olmasına rağmen, gösterir.
Tim, 26:54'te, basit ve yaygın türler için string, tam sayılar ve sınıf örnekleri gibi açık türleri kullanmayı tercih ettiğini çünkü kodu daha net hale getirdiğini açıklar. Ancak, var'yı türün uzun, karmaşık veya açıkça bilinmediği durumlarda, anonim türler veya karmaşık tür ilanları gibi, kullanır.
Sonuç
İşte bu—C# değişkenleri ve veri türleri hakkında net bir anlayış, var ve dynamic anahtar kelimelerinin stratejik kullanımıyla birlikte. Tim Corey'nin dengeli yaklaşımını izleyerek, var anahtar kelimesi ile kodunuzda tür güvenliğini ve netliği sağlayabilir, dynamic anahtar kelimesinin esnekliğinden dış sistemlerle etkileşim gibi belirli senaryolar için faydalanabilirsiniz.
Daha detaylı içgörüler için, Tim Corey'nin 'C#'ta Dinamik ve Var' videosunu izlediğinizden emin olun ve daha fazla C# öğrenme konuları için YouTube Kanalını mutlaka ziyaret edin.




