Elbette, bir Java geliştiricisinin yarım saatte C# öğrenmesi için ana konulara odaklanacağım. C# ve Java birçok benzerliğe sahip oldukları için, bu süre içinde temel farklara ve C# özelindeki önemli özelliklere odaklanacağım. Hazırsanız başlayalım.
1. Genel Bakış
Dil Yapısı: C# ve Java, her ikisi de C-tabanlı diller olduğu için, sözdizimi açısından birbirlerine oldukça benzer. İf, for, while gibi yapılar hemen hemen aynıdır.
Nesne Yönelimli Programlama (OOP): Her iki dil de sınıf tabanlı ve nesne yönelimli. Ancak C#’da yapılar (structs) ve kayıt tipleri (record types) gibi Java’da olmayan bazı özellikler bulunur.
Hafıza Yönetimi: Java'da olduğu gibi C#'da da otomatik çöp toplama (garbage collection) mevcuttur.
2. Platform Bağımsızlık
Java: Java, "write once, run anywhere" (bir kere yaz, her yerde çalıştır) ilkesiyle platform bağımsızlığını sağlar.
C#: C# başlangıçta Microsoft'un .NET çerçevesi için geliştirilmişti ve daha çok Windows ile ilişkilendiriliyor. Ancak, .NET Core ile birlikte artık Linux ve macOS üzerinde de çalışabilmekte.
3. Gelişmiş Özellikler
LINQ: Language Integrated Query, C#’da veri sorgulama için güçlü ve esnek bir yol sunar. Java’da bu tür bir dil içi sorgulama yoktur.
Delegeler ve Olaylar: C#’da, delegeler fonksiyonları temsil eder ve olaylar (events) için kullanılır. Java'da bu işlevsellikler genellikle arayüzler (interfaces) ile sağlanır.
Yapılar (Structs): C#, değer türlerini tanımlamak için yapılar sunar. Java’da buna benzer bir yapı yoktur; her şey nesnedir.
4. Sözdizimi Farklılıkları
Özellikler (Properties): C# özellikleri, alanlara (fields) erişimi kolaylaştırır ve get/set metodlarına alternatif sunar. Java’da bunun için genellikle manuel get ve set metodları yazılır.
Indexerler: C#’da, dizi benzeri sınıflar için indexer tanımlamak mümkündür. Java’da bu tür bir yapı yoktur; metodlar kullanılır.
5. Geliştirme Ortamı ve Araçlar
Visual Studio: C# geliştiricileri genellikle Microsoft’un Visual Studio IDE’sini kullanırlar. Bu, zengin özellikler sunar ve .NET ile entegre çalışır.
Cross-Platform Geliştirme: .NET Core ve Visual Studio Code sayesinde, C# artık Windows dışındaki platformlarda da etkili bir şekilde kullanılabilmektedir.
Devamı için Öneriler
Asenkron Programlama: C#'da async ve await anahtar kelimeleri ile asenkron programlama yapılır. Java’da ise bu, CompletableFuture ve benzeri araçlarla sağlanır.
Yansıma (Reflection): C# ve Java her ikisinde de yansıma (reflection) mevcuttur, ancak kullanım detayları farklılık gösterir.
Genel Kullanım Farklılıkları: Döngüler, koşul ifadeleri, hata yakalama gibi temel programlama yapıları benzer olsa da, dilin kendine has özelliklerini öğrenmek önemlidir.
Bu bilgiler, Java'dan C#'a geçiş yaparken size bir başlangıç noktası sağlay
Kod örnekleriyle devam et ve Java ile karşılaştır
Tabii, C#'da bazı temel konseptlerin ve özelliklerin kod örnekleriyle Java ile karşılaştırılmasını yaparak devam edelim.
1. Sınıflar ve Metotlar
Java:
java
Copy code
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
C#:
csharp
Copy code
using System;
public class HelloWorld {
public static void Main() {
Console.WriteLine("Hello, C#!");
}
}
Java ve C# sınıf yapısı ve metod tanımları oldukça benzerdir. Her iki dilde de public static void main metodu uygulama giriş noktasıdır.
2. Özellikler (Properties)
Java:
java
Copy code
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
C#:
csharp
Copy code
public class Person {
public string Name { get; set; }
}
C#'da özellikler (properties), alanlara (fields) yönelik daha temiz ve okunabilir bir sözdizimi sağlar. Java'da aynı işlevsellik, getter ve setter metotları ile elde edilir.
3. Delegeler ve Olaylar
Java:
java
Copy code
interface MessageListener {
void onMessageReceived(String message);
}
public class MessageProcessor {
private MessageListener listener;
public void setListener(MessageListener listener) {
this.listener = listener;
}
public void process(String message) {
if (listener != null) {
listener.onMessageReceived(message);
}
}
}
C#:
csharp
Copy code
public delegate void MessageReceivedHandler(string message);
public class MessageProcessor {
public event MessageReceivedHandler MessageReceived;
public void Process(string message) {
MessageReceived?.Invoke(message);
}
}
C#'da delegeler ve olaylar (events), olay tabanlı programlamada kullanılır. Java'da bu genellikle arayüzler (interfaces) ile yapılır.
4. Asenkron Programlama
Java:
java
Copy code
public CompletableFuture<String> getDataAsync() {
return CompletableFuture.supplyAsync(() -> "Data from async operation");
}
// Kullanım
CompletableFuture<String> future = getDataAsync();
future.thenAccept(System.out::println);
C#:
csharp
Copy code
public async Task<string> GetDataAsync() {
return await Task.Run(() => "Data from async operation");
}
// Kullanım
string data = await GetDataAsync();
Console.WriteLine(data);
C# ve Java her ikisi de modern asenkron programlama modellerini destekler. C#'da async ve await anahtar kelimeleri, Java'da ise CompletableFuture kullanılır.
5. LINQ ve Stream API
Java (Stream API):
java
Copy code
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> filtered = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
C# (LINQ):
csharp
Copy code
using System.Linq;
List<string> names = new List<string> { "Alice", "Bob", "Charlie" };
List<string> filtered = names.Where(name => name.StartsWith("A")).ToList();
C#'daki LINQ ve Java'daki Stream API, koleksiyonlar üzerinde sorgu yazmayı ve işlemler yapmayı kolaylaştırır. Her iki dilde de benzer işlevsellikler bulunur, ancak sözdizimleri farklıdır.
Bu örnekler, Java'dan C#'a geçiş yaparken temel yapıları ve dil özelliklerini anlamanıza yardımcı olacaktır. Her iki dilin de kendi içinde zengin özelliklere ve kütüphanelere sahip olduğunu unutmayın. Bu yüzden, pratik yaparak ve dökümantasyonları inceleyerek öğrenme sürecinizi derinleştirebilirsiniz.
C#'ı temel düzeyde ve basit kod örnekleriyle anlatmaya çalışacağım. Kodlamaya yeni başlayan veya programlama konusunda az bilgisi olan biri için bile anlaşılabilir olması için adım adım ilerleyeceğim.
1. Temel Yapı
C# programları genellikle bir veya birden fazla "class" (sınıf) içerir. Bir sınıf, kodun organize edildiği bir yapıdır. En temel C# programı aşağıdaki gibidir:
csharp
Copy code
using System;
class Program
{
static void Main()
{
Console.WriteLine("Merhaba Dünya!");
}
}
using System;: Bu satır, C# programının, sistemle ilgili işlevleri kullanabilmesi için gerekli olan kodları içe aktarır.
class Program: Bu, "Program" adında bir sınıf tanımlar.
static void Main(): Her C# programının başlangıç noktasıdır. Program çalıştırıldığında, Main metodu otomatik olarak çağrılır.
Console.WriteLine("Merhaba Dünya!");: Ekran üzerine "Merhaba Dünya!" yazdırır.
2. Değişkenler ve Veri Tipleri
Değişkenler, verileri saklamak için kullanılır. Her değişkenin bir veri tipi vardır.
csharp
Copy code
int sayi = 10;
string metin = "Merhaba";
bool dogruMu = true;
int sayi = 10;: "sayi" adında bir tam sayı değişkeni oluşturur ve ona 10 değerini atar.
string metin = "Merhaba";: "metin" adında bir metin (string) değişkeni oluşturur ve ona "Merhaba" değerini atar.
bool dogruMu = true;: "dogruMu" adında bir boolean (doğru/yanlış) değişkeni oluşturur ve ona "true" (doğru) değerini atar.
3. Koşullu İfadeler
Koşullu ifadeler, belirli koşullara göre farklı kod bloklarının çalıştırılmasını sağlar.
csharp
Copy code
int sayi = 10;
if (sayi > 5)
{
Console.WriteLine("Sayı 5'ten büyük.");
}
else
{
Console.WriteLine("Sayı 5'ten küçük veya eşit.");
}
Bu kodda, sayi değişkeninin değeri 5'ten büyükse bir mesaj yazdırılır, değilse başka bir mesaj yazdırılır.
4. Döngüler
Döngüler, belirli bir kod blokunu tekrar tekrar çalıştırmak için kullanılır.
csharp
Copy code
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Döngü: " + i);
}
Bu kod, 0'dan başlayarak 4'e kadar olan sayıları yazdırır. Her adımda "i" değişkeni 1 arttırılır ve 5 olduğunda döngü sona erer.
5. Fonksiyonlar
Fonksiyonlar, belirli bir işlevi gerçekleştiren kod bloklarıdır. Fonksiyonlar tekrar kullanılabilir ve organize kod yazmayı sağlar.
csharp
Copy code
static int Topla(int sayi1, int sayi2)
{
return sayi1 + sayi2;
}
static void Main()
{
int sonuc = Topla(5, 3);
Console.WriteLine("Toplam: " + sonuc);
}
Bu örnekte, Topla adında bir fonksiyon tanımlanmış ve iki sayıyı toplayıp sonucu döndürmektedir. Main metodunda bu fonksiyon çağrılır ve sonucu ekrana yazdırılır.
Tabii, C#'ın temel yapı taşlarını anlamaya devam edelim.
6. Diziler
Diziler, aynı türdeki birden fazla değeri bir arada tutmanızı sağlar.
csharp
Copy code
int[] sayilar = new int[3];
sayilar[0] = 1;
sayilar[1] = 2;
sayilar[2] = 3;
// Dizi elemanlarını yazdırmak için döngü kullanabiliriz.
for (int i = 0; i < sayilar.Length; i++)
{
Console.WriteLine(sayilar[i]);
}
Bu kod, 3 elemanlı bir tam sayı dizisi oluşturur, değerleri atar ve sonra bu değerleri yazdırır.
7. Listeler
Listeler, boyutları dinamik olarak değişebilen koleksiyonlardır.
csharp
Copy code
using System.Collections.Generic;
List<string> isimler = new List<string>();
isimler.Add("Ali");
isimler.Add("Ayşe");
isimler.Add("Ahmet");
foreach (var isim in isimler)
{
Console.WriteLine(isim);
}
Bu kod, string türünden bir liste oluşturur, bazı isimler ekler ve sonra bu isimleri yazdırır.
8. Sözlükler
Sözlükler, anahtar-değer çiftleri şeklinde veri saklamak için kullanılır.
csharp
Copy code
using System.Collections.Generic;
Dictionary<string, int> telefonDefteri = new Dictionary<string, int>();
telefonDefteri.Add("Ahmet", 12345);
telefonDefteri.Add("Ayşe", 67890);
if (telefonDefteri.ContainsKey("Ahmet"))
{
Console.WriteLine("Ahmet'in telefon numarası: " + telefonDefteri["Ahmet"]);
}
Bu kod, isimler ve telefon numaralarını saklayan bir sözlük oluşturur ve ardından bir ismin telefon numarasını sorgular.
9. Hata Yakalama
Programlarınızda oluşabilecek hataları yakalamak için try-catch bloklarını kullanabilirsiniz.
csharp
Copy code
try
{
int bolen = 0;
int sonuc = 10 / bolen;
Console.WriteLine(sonuc);
}
catch (DivideByZeroException)
{
Console.WriteLine("Bir sayı sıfıra bölünemez!");
}
Bu kod, sıfıra bölme hatasını yakalar ve bir hata mesajı yazdırır.
10. Sınıf ve Nesneler
Sınıflar, nesne yönelimli programlamanın temel yapı taşlarıdır. Sınıflar, veri ve fonksiyonları bir arada tutar.
csharp
Copy code
class Kisi
{
public string Ad;
public int Yas;
public void SelamVer()
{
Console.WriteLine("Merhaba, ben " + Ad + ", yaşım " + Yas);
}
}
static void Main()
{
Kisi kisi1 = new Kisi();
kisi1.Ad = "Ali";
kisi1.Yas = 30;
kisi1.SelamVer();
}
Bu kod, Kisi adında bir sınıf tanımlar ve bu sınıfı kullanarak bir nesne oluşturur. Daha sonra bu nesne üzerinden fonksiyon çağrılır.
Bu örnekler, C#'ın temel yapı taşları hakkında temel bir anlayış sağlamak içindir. Her bir konsept, daha detaylı incelenebilir ve karmaşık programlar oluşturmak için kullanılabilir. Başlangıç için bu temel bilgiler, C# programlamaya giriş yapmak için yeterlidir.
Elbette, C#'ın temel yapı taşlarını daha da derinlemesine inceleyelim.
11. Yapıcı Metotlar (Constructor)
Yapıcı metotlar, bir sınıfın nesnesi oluşturulduğunda otomatik olarak çağrılır. Nesne başlangıç değerleri ayarlamak için kullanılır.
csharp
Copy code
class Kisi
{
public string Ad;
public int Yas;
public Kisi(string ad, int yas)
{
Ad = ad;
Yas = yas;
}
public void SelamVer()
{
Console.WriteLine("Merhaba, ben " + Ad + ", yaşım " + Yas);
}
}
static void Main()
{
Kisi kisi1 = new Kisi("Ali", 30);
kisi1.SelamVer();
}
Bu kodda Kisi sınıfı için bir yapıcı metot (constructor) tanımlanmıştır. Bu yapıcı, nesne oluşturulurken ad ve yaş değerlerini alır.
12. Kalıtım (Inheritance)
Kalıtım, bir sınıfın başka bir sınıfın özelliklerini ve metodlarını miras almasını sağlar.
csharp
Copy code
class Canli
{
public void SolunumYap()
{
Console.WriteLine("Solunum yapılıyor...");
}
}
class Insan : Canli
{
public void Konus()
{
Console.WriteLine("Merhaba!");
}
}
static void Main()
{
Insan insan = new Insan();
insan.SolunumYap(); // Miras alınan metot
insan.Konus(); // Insan sınıfına ait metot
}
Bu örnekte, Insan sınıfı Canli sınıfından türetilmiştir ve Canli sınıfının metodlarını kullanabilir.
13. Arayüzler (Interfaces)
Arayüzler, sınıfların uygulaması gereken metodları tanımlar.
csharp
Copy code
interface IKonusabilir
{
void Konus();
}
class Insan : IKonusabilir
{
public void Konus()
{
Console.WriteLine("Merhaba!");
}
}
static void Main()
{
Insan insan = new Insan();
insan.Konus();
}
Bu örnekte, Insan sınıfı IKonusabilir arayüzünü uygular ve Konus metodunu tanımlamak zorundadır.
14. Polimorfizm
Polimorfizm, aynı arayüzü farklı sınıflarda farklı şekillerde uygulama yeteneğidir.
csharp
Copy code
class Kedi : IKonusabilir
{
public void Konus()
{
Console.WriteLine("Miyav!");
}
}
static void Main()
{
IKonusabilir kedi = new Kedi();
kedi.Konus(); // "Miyav!"
}
Bu örnekte, Kedi sınıfı da IKonusabilir arayüzünü uygular, ancak Konus metodunu farklı bir şekilde gerçekleştirir.
15. Genel Kullanım (Generics)
Genel kullanım, türden bağımsız kod yazmayı sağlar.
csharp
Copy code
class Kutu<T>
{
public T Icerik { get; set; }
public void Yazdir()
{
Console.WriteLine("İçerik: " + Icerik);
}
}
static void Main()
{
Kutu<string> stringKutu = new Kutu<string>();
stringKutu.Icerik = "Merhaba";
stringKutu.Yazdir();
}
Bu örnekte, Kutu<T> sınıfı herhangi bir türde (T) veriyi tutabilir. Bu sayede aynı sınıf, farklı veri türleriyle kullanılabilir.
Bu kod parçaları, C# programlama dilinin temel kavramlarını ve yapılarını temsil eder. C#'ı öğrenirken bu kavramların üzerine inşa ederek daha karmaşık programlar geliştirebilirsiniz. Her yeni konsept, pratik yaparak ve örnekler üzerinden çalışarak daha i
C# programlama dilinin temel kavramlarını anlamaya devam edelim.
16. Özelikler (Properties)
Özellikler, bir sınıfın alanlarına (fields) güvenli erişim sağlar ve bu alanları yönetmek için get ve set metotlarını kullanır.
csharp
Copy code
class Kisi
{
private string ad;
public string Ad
{
get { return ad; }
set { ad = value; }
}
}
static void Main()
{
Kisi kisi = new Kisi();
kisi.Ad = "Ali"; // set metodu çalışır
Console.WriteLine(kisi.Ad); // get metodu çalışır
}
Bu örnekte, Kisi sınıfında Ad isminde bir özellik tanımlanmış ve bu özellik üzerinden ad alanına güvenli bir şekilde erişilmiş ve değer ataması yapılmıştır.
17. Statik Üyeler
Statik üyeler, sınıfın kendisine ait olup nesneler arasında paylaşılan üyelerdir.
csharp
Copy code
class Matematik
{
public static int Topla(int a, int b)
{
return a + b;
}
}
static void Main()
{
int sonuc = Matematik.Topla(5, 10); // Nesne oluşturmadan doğrudan sınıf üzerinden erişim
Console.WriteLine(sonuc);
}
Bu örnekte, Topla metoduna Matematik sınıfının bir nesnesini oluşturmadan, sınıf adı üzerinden erişilir.
18. Enumlar (Enumerations)
Enumlar, sabit değerler kümesini adlandırılmış sabitlerle temsil eder.
csharp
Copy code
enum Gunler { Pazartesi, Sali, Carsamba, Persembe, Cuma, Cumartesi, Pazar }
static void Main()
{
Gunler bugun = Gunler.Cuma;
Console.WriteLine(bugun); // Cuma
}
Bu örnekte, haftanın günleri bir enum olarak tanımlanmış ve bir enum değeri kullanılmıştır.
19. Exception (İstisna) Yönetimi
Hataları (exceptions) yakalamak ve işlemek için try-catch-finally blokları kullanılır.
csharp
Copy code
try
{
int[] sayilar = new int[2];
sayilar[10] = 99; // Bu satır bir IndexOutOfRangeException hatası oluşturur
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine("Bir hata oluştu: " + ex.Message);
}
finally
{
Console.WriteLine("Bu blok her zaman çalışır.");
}
Bu kodda, bir dizi dışına çıkma hatası oluşturulur, yakalanır ve işlenir.
20. Namespaces (Ad Alanları)
Namespaces, kodu organize etmek için kullanılır ve çakışan sınıf adlarını önlemeye yardımcı olur.
csharp
Copy code
namespace Matematik
{
class Hesap
{
public static int Topla(int a, int b)
{
return a + b;
}
}
}
static void Main()
{
int sonuc = Matematik.Hesap.Topla(5, 7);
Console.WriteLine(sonuc);
}
Bu örnekte, Hesap sınıfı Matematik ad alanı içinde tanımlanmıştır.
Bu temel özellikler ve yapılar, C# programlama dilinin ana hatlarını oluşturur. Her bir konsept, daha kapsamlı ve detaylı uygulamalar için bir temel teşkil eder. Öğrenme sürecinde bu yapıların üzerine kendi projeleriniz ve pratiklerinizle ekleyerek ilerleyebilirsiniz.
C# programlama dilindeki daha ileri düzey konseptlere ve özelliklere değinelim.
21. Event Handling (Olay İşleme)
C# event handling, bir olayın gerçekleştiğinde belirli kodların çalıştırılmasını sağlar. Bu, genellikle kullanıcı arayüzleri ve asenkron programlama için kullanılır.
csharp
Copy code
using System;
class Zil
{
public event EventHandler ZilCalindi;
public void Cal()
{
Console.WriteLine("Zil çalıyor...");
OnZilCalindi();
}
protected virtual void OnZilCalindi()
{
ZilCalindi?.Invoke(this, EventArgs.Empty);
}
}
class Okul
{
static void Main()
{
Zil zil = new Zil();
zil.ZilCalindi += Zil_CalindiEvent;
zil.Cal();
}
private static void Zil_CalindiEvent(object sender, EventArgs e)
{
Console.WriteLine("Zil çalındı eventi işlendi.");
}
}
Bu örnekte, Zil sınıfı bir olay (event) tanımlar ve bu olay Cal metodu çağrıldığında tetiklenir. Okul sınıfı, bu olaya bir işleyici (handler) atar.
22. Delege (Delegate)
Delegate'ler, metodlara referanslar olarak düşünülebilir. Bu, metotları değişkenler gibi geçirmenizi sağlar.
csharp
Copy code
delegate int Hesapla(int x, int y);
class Matematik
{
public int Topla(int a, int b)
{
return a + b;
}
public int Cikar(int a, int b)
{
return a - b;
}
}
static void Main()
{
Matematik matematik = new Matematik();
Hesapla toplaDelege = new Hesapla(matematik.Topla);
Hesapla cikarDelege = new Hesapla(matematik.Cikar);
int toplam = toplaDelege(10, 5);
int fark = cikarDelege(10, 5);
Console.WriteLine("Toplam: " + toplam);
Console.WriteLine("Fark: " + fark);
}
Bu örnekte, Hesapla adında bir delegate tanımlanmış ve Matematik sınıfının Topla ve Cikar metodlarına referans olarak atanan delegate'ler kullanılmıştır.
23. Asenkron Programlama
Asenkron programlama, programın diğer işlemleri engellemeden, arka planda işlemleri sürdürmesini sağlar.
csharp
Copy code
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
await UzunSurenIslem();
Console.WriteLine("Asenkron işlem tamamlandı.");
}
static async Task UzunSurenIslem()
{
Console.WriteLine("Uzun süren işlem başladı...");
await Task.Delay(2000); // 2 saniye bekler
Console.WriteLine("Uzun süren işlem bitti.");
}
}
Bu kod, UzunSurenIslem metodunu asenkron olarak çalıştırır ve tamamlandığında bir mesaj yazdırır.
24. Extension Methods (Genişletme Metotları)
Extension metotlar, var olan bir tipe yeni metotlar eklemenizi sağlar.
csharp
Copy code
public static class StringExtensions
{
public static int KelimeSayisi(this string str)
{
return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
static void Main()
{
string metin = "Bu bir test cümlesidir.";
int kelimeSayisi = metin.KelimeSayisi();
Console.WriteLine("Kelime Sayısı: " + kelimeSayisi);
}
Bu örnekte, String türüne KelimeSayisi adında bir genişletme metodu eklenmiştir.