1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
|
---
language: c#
contributors:
- ["Irfan Charania", "https://github.com/irfancharania"]
- ["Max Yankov", "https://github.com/golergka"]
- ["Melvyn Laïly", "http://x2a.yt"]
- ["Shaun McCarthy", "http://www.shaunmccarthy.com"]
- ["Melih Mucuk", "http://melihmucuk.com"]
filename: LearnCSharp.cs
---
C# zarif ve tip güvenli nesne yönelimli bir dil olup geliştiricilerin .NET framework üzerinde çalışan güçlü ve güvenli uygulamalar geliştirmesini sağlar.
[Daha fazlasını okuyun.](http://msdn.microsoft.com/en-us/library/vstudio/z1zx9t92.aspx)
```c#
// Tek satırlık yorumlar // ile başlar
/*
Birden fazla satırlı yorumlar buna benzer
*/
/// <summary>
/// Bu bir XML dokümantasyon yorumu
/// </summary>
// Uygulamanın kullanacağı ad alanlarını belirtin
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Dynamic;
using System.Linq;
using System.Linq.Expressions;
using System.Net;
using System.Threading.Tasks;
using System.IO;
// Kodu düzenlemek için paketler içinde alan tanımlayın
namespace Learning
{
// Her .cs dosyası, dosya ile aynı isimde en az bir sınıf içermeli
// bu kurala uymak zorunda değilsiniz ancak mantıklı olan yol budur.
public class LearnCSharp
{
// TEMEL SÖZ DİZİMİ - daha önce Java ya da C++ kullandıysanız İLGİNÇ ÖZELLİKLER'e geçin
public static void Syntax()
{
// Satırları yazdırmak için Console.WriteLine kullanın
Console.WriteLine("Merhaba Dünya");
Console.WriteLine(
"Integer: " + 10 +
" Double: " + 3.14 +
" Boolean: " + true);
// Yeni satıra geçmeden yazdırmak için Console.Write kullanın
Console.Write("Merhaba ");
Console.Write("Dünya");
///////////////////////////////////////////////////
// Tipler & Değişkenler
//
// Bir değişken tanımlamak için <tip> <isim> kullanın
///////////////////////////////////////////////////
// Sbyte - Signed 8-bit integer
// (-128 <= sbyte <= 127)
sbyte fooSbyte = 100;
// Byte - Unsigned 8-bit integer
// (0 <= byte <= 255)
byte fooByte = 100;
// Short - 16-bit integer
// Signed - (-32,768 <= short <= 32,767)
// Unsigned - (0 <= ushort <= 65,535)
short fooShort = 10000;
ushort fooUshort = 10000;
// Integer - 32-bit integer
int fooInt = 1; // (-2,147,483,648 <= int <= 2,147,483,647)
uint fooUint = 1; // (0 <= uint <= 4,294,967,295)
// Long - 64-bit integer
long fooLong = 100000L; // (-9,223,372,036,854,775,808 <= long <= 9,223,372,036,854,775,807)
ulong fooUlong = 100000L; // (0 <= ulong <= 18,446,744,073,709,551,615)
// Sayılar boyutlarına göre ön tanımlı olarak int ya da uint olabilir.
// L, değişken değerinin long ya da ulong tipinde olduğunu belirtmek için kullanılır.
// Double - Çift hassasiyetli 64-bit IEEE 754 kayan sayı
double fooDouble = 123.4; // Hassasiyet: 15-16 basamak
// Float - Tek hassasiyetli 32-bit IEEE 754 kayan sayı
float fooFloat = 234.5f; // Hassasiyet: 7 basamak
// f, değişken değerinin float tipinde olduğunu belirtmek için kullanılır.
// Decimal - 128-bit veri tiğinde ve diğer kayan sayı veri tiplerinden daha hassastır,
// finansal ve mali hesaplamalar için uygundur.
decimal fooDecimal = 150.3m;
// Boolean - true & false
bool fooBoolean = true; // veya false
// Char - 16-bitlik tek bir unicode karakter
char fooChar = 'A';
// Strings -- Önceki baz tiplerinin hepsi değer tipiyken,
// string bir referans tipidir. Null değer atayabilirsiniz
string fooString = "\"escape\" quotes and add \n (new lines) and \t (tabs)";
Console.WriteLine(fooString);
// İndeks numarası kullanarak bir string'in bütün karakterlerine erişilebilirsiniz:
char charFromString = fooString[1]; // => 'e'
// String'ler değiştirilemez: fooString[1] = 'X' işlemini yapamazsınız;
// String'leri geçerli kültür değeri ve büyük küçük harf duyarlılığı olmadan karşılaştırma
string.Compare(fooString, "x", StringComparison.CurrentCultureIgnoreCase);
// sprintf baz alınarak formatlama
string fooFs = string.Format("Check Check, {0} {1}, {0} {1:0.0}", 1, 2);
// Tarihler & Formatlama
DateTime fooDate = DateTime.Now;
Console.WriteLine(fooDate.ToString("hh:mm, dd MMM yyyy"));
// Bir string'i iki satıra bölmek için @ sembolü kullanabilirsiniz. " işaretinden kaçmak için "" kullanın
string bazString = @"Here's some stuff
on a new line! ""Wow!"", the masses cried";
// Bir değişkeni değiştirilemez yapmak için const ya da read-only kullanın.
// const değerleri derleme sırasında hesaplanır
const int HOURS_I_WORK_PER_WEEK = 9001;
///////////////////////////////////////////////////
// Veri Yapıları
///////////////////////////////////////////////////
// Diziler - Sıfır indeksli
// Dizi boyutuna tanımlama sırasında karar verilmelidir.
// Dizi tanımlama formatı şöyledir:
// <veri tipi>[] <değişken ismi> = new <veri tipi>[<dizi boyutu>];
int[] intArray = new int[10];
// Bir diğer dizi tanımlama formatı şöyledir:
int[] y = { 9000, 1000, 1337 };
// Bir diziyi indeksleme - Bir elemente erişme
Console.WriteLine("intArray @ 0: " + intArray[0]);
// Diziler değiştirilebilir.
intArray[1] = 1;
// Listeler
// Listeler daha esnek oldukları için dizilerden daha sık kullanılırlar.
// Bir liste tanımlama formatı şöyledir:
// List<veri tipi> <değişken ismi> = new List<veri tipi>();
List<int> intList = new List<int>();
List<string> stringList = new List<string>();
List<int> z = new List<int> { 9000, 1000, 1337 }; // tanımlama
// <> işareti generic ifadeler içindir - Güzel özellikler sekmesini inceleyin
// Listelerin varsayılan bir değeri yoktur;
// İndekse erişmeden önce değer eklenmiş olmalıdır
intList.Add(1);
Console.WriteLine("intList @ 0: " + intList[0]);
// Diğer veri yapıları için şunlara bakın:
// Stack/Queue (Yığın/Kuyruk)
// Dictionary (hash map'in uygulanması) (Sözlük)
// HashSet (karma seti)
// Read-only Collections (Değiştirilemez koleksiyonlar)
// Tuple (.Net 4+) (tüp)
///////////////////////////////////////
// Operatörler
///////////////////////////////////////
Console.WriteLine("\n->Operators");
int i1 = 1, i2 = 2; // Birden çok tanımlamanın kısa yolu
// Aritmetik basittir
Console.WriteLine(i1 + i2 - i1 * 3 / 7); // => 3
// Mod
Console.WriteLine("11%3 = " + (11 % 3)); // => 2
// Karşılaştırma operatörleri
Console.WriteLine("3 == 2? " + (3 == 2)); // => false
Console.WriteLine("3 != 2? " + (3 != 2)); // => true
Console.WriteLine("3 > 2? " + (3 > 2)); // => true
Console.WriteLine("3 < 2? " + (3 < 2)); // => false
Console.WriteLine("2 <= 2? " + (2 <= 2)); // => true
Console.WriteLine("2 >= 2? " + (2 >= 2)); // => true
// Bit düzeyi operatörleri!
/*
~ Tekli bit tamamlayıcısı
<< Sola kaydırma Signed left shift
>> Sağa kaydırma Signed right shift
& Bit düzeyi AND
^ Bit düzeyi harici OR
| Bit düzeyi kapsayan OR
*/
// Arttırma
int i = 0;
Console.WriteLine("\n->Inc/Dec-rementation");
Console.WriteLine(i++); //i = 1. Post-Incrementation
Console.WriteLine(++i); //i = 2. Pre-Incrementation
Console.WriteLine(i--); //i = 1. Post-Decrementation
Console.WriteLine(--i); //i = 0. Pre-Decrementation
///////////////////////////////////////
// Kontrol Yapıları
///////////////////////////////////////
Console.WriteLine("\n->Control Structures");
// If ifadesi c benzeridir
int j = 10;
if (j == 10)
{
Console.WriteLine("I get printed");
}
else if (j > 10)
{
Console.WriteLine("I don't");
}
else
{
Console.WriteLine("I also don't");
}
// Üçlü operatörler
// Basit bir if/else ifadesi şöyle yazılabilir
// <koşul> ? <true> : <false>
string isTrue = (true) ? "True" : "False";
// While döngüsü
int fooWhile = 0;
while (fooWhile < 100)
{
//100 kere tekrarlanır, fooWhile 0->99
fooWhile++;
}
// Do While Döngüsü
int fooDoWhile = 0;
do
{
//100 kere tekrarlanır, fooDoWhile 0->99
fooDoWhile++;
} while (fooDoWhile < 100);
//for döngüsü yapısı => for(<başlangıç ifadesi>; <koşul>; <adım>)
for (int fooFor = 0; fooFor < 10; fooFor++)
{
//10 kere tekrarlanır, fooFor 0->9
}
// For Each Döngüsü
// foreach döngüsü yapısı => foreach(<yineleyici tipi> <yineleyici ismi> in <enumerable>)
// foreach döngüsü, IEnumerable ya da IEnumerable<T> e dönüştürülmüş herhangi bir obje üzerinde döngü yapabilir
// .Net framework üzerindeki bütün koleksiyon tiplerinden (Dizi, Liste, Sözlük...)
// biri ya da hepsi uygulanarak gerçekleştirilebilir.
// (ToCharArray() silindi, çünkü string'ler aynı zamanda IEnumerable'dır.)
foreach (char character in "Hello World".ToCharArray())
{
//String içindeki bütün karakterler üzerinde döner
}
// Switch Case
// Bir switch byte, short, char ve int veri tipleri ile çalışır.
// Aynı zamanda sıralı tipler ile de çalışabilir.(Enum Tipleri bölümünde tartışıldı),
// String sınıfı, ve bir kaç özel sınıf kaydırılır
// basit tipler: Character, Byte, Short, and Integer.
int month = 3;
string monthString;
switch (month)
{
case 1:
monthString = "January";
break;
case 2:
monthString = "February";
break;
case 3:
monthString = "March";
break;
// Bir aksiyon için birden fazla durum atayabilirsiniz
// Ancak, break olmadan yeni bir durum ekleyemezsiniz
// (Eğer bunu yapmak istiyorsanız, goto komutu eklemek zorundasınız)
case 6:
case 7:
case 8:
monthString = "Summer time!!";
break;
default:
monthString = "Some other month";
break;
}
///////////////////////////////////////
// Veri Tipleri Dönüştürme ve Typecasting
///////////////////////////////////////
// Veri Dönüştürme
// String'i Integer'a Dönüştürme
// bu başarısız olursa hata fırlatacaktır
int.Parse("123");// "123" 'in Integer değerini döndürür
// try parse hata durumunda değişkene varsayılan bir değer atamak için kullanılır
// bu durumda: 0
int tryInt;
if (int.TryParse("123", out tryInt)) // Fonksiyon boolean'dır
Console.WriteLine(tryInt); // 123
// Integer'ı String'e Dönüştürme
// Convert sınıfı dönüştürme işlemini kolaylaştırmak için bir dizi metoda sahiptir
Convert.ToString(123);
// veya
tryInt.ToString();
}
///////////////////////////////////////
// SINIFLAR - dosyanın sonunda tanımları görebilirsiniz
///////////////////////////////////////
public static void Classes()
{
// Obje tanımlamalarını dosyanın sonunda görebilirsiniz
// Bir sınıfı türetmek için new kullanın
Bicycle trek = new Bicycle();
// Obje metodlarını çağırma
trek.SpeedUp(3); // Her zaman setter ve getter metodları kullanmalısınız
trek.Cadence = 100;
// ToString objenin değerini göstermek için kullanılır.
Console.WriteLine("trek info: " + trek.Info());
// Yeni bir Penny Farthing sınıfı türetmek
PennyFarthing funbike = new PennyFarthing(1, 10);
Console.WriteLine("funbike info: " + funbike.Info());
Console.Read();
} // Ana metodun sonu
// KONSOLE BAŞLANGICI Bir konsol uygulaması başlangıç olarak mutlaka ana metod'a sahip olmalı
public static void Main(string[] args)
{
OtherInterestingFeatures();
}
//
// İLGİNÇ ÖZELLİKLER
//
// VARSAYILAN METOD TANIMLAMALARI
public // Görünebilir
static // Sınıf üzerinden obje türetmeden çağırılabilir
int // Dönüş Tipi,
MethodSignatures(
int maxCount, // İlk değişken, int değer bekler
int count = 0, // Eğer değer gönderilmezse varsayılan olarak 0 değerini alır
int another = 3,
params string[] otherParams // Metoda gönderilen diğer bütün parametreleri alır
)
{
return -1;
}
// Metodlar tanımlamalar benzersiz ise aynı isimleri alabilirler
public static void MethodSignatures(string maxCount)
{
}
// GENERIC'LER
// TKey ve TValue değerleri kullanıcı tarafından bu fonksiyon çağırılırken belirtilir.
// Bu metod Python'daki SetDefault'a benzer
public static TValue SetDefault<TKey, TValue>(
IDictionary<TKey, TValue> dictionary,
TKey key,
TValue defaultItem)
{
TValue result;
if (!dictionary.TryGetValue(key, out result))
return dictionary[key] = defaultItem;
return result;
}
// Gönderilen objeleri daraltabilirsiniz
public static void IterateAndPrint<T>(T toPrint) where T: IEnumerable<int>
{
// Eğer T IEnumerable ise tekrarlayabiliriz
foreach (var item in toPrint)
// Item bir int
Console.WriteLine(item.ToString());
}
public static void OtherInterestingFeatures()
{
// İSTEĞE BAĞLI PARAMETRELER
MethodSignatures(3, 1, 3, "Some", "Extra", "Strings");
MethodSignatures(3, another: 3); // isteğe bağlı olanlar gönderilmedi
// UZANTI METODLARI
int i = 3;
i.Print(); // Aşağıda tanımlandı
// NULLABLE TYPES - veri tabanı işlemleri için uygun / return values
// Herhangi bir değer tipi sonuna ? eklenerek nullable yapılabilir (sınıflar hariç)
// <tip>? <değiken ismi> = <değer>
int? nullable = null; // Nullable<int> için kısa yol
Console.WriteLine("Nullable variable: " + nullable);
bool hasValue = nullable.HasValue; // eğer null değilse true döner
// ?? varsayılan değer belirlemek için söz dizimsel güzel bir özellik
// bu durumda değişken null'dır
int notNullable = nullable ?? 0; // 0
// TİPİ BELİRTİLMEMİŞ DEĞİŞKENLER - compiler değişkenin tipini bilmeden çalışabilir:
var magic = "magic is a string, at compile time, so you still get type safety";
// magic = 9; string gibi çalışmayacaktır, bu bir int değil
// GENERIC'LER
//
var phonebook = new Dictionary<string, string>() {
{"Sarah", "212 555 5555"} // Telefon rehberine bir kaç numara ekleyelim.
};
// Yukarıda generic olarak tanımlanan SETDEFAULT'u çağırma
Console.WriteLine(SetDefault<string,string>(phonebook, "Shaun", "No Phone")); // Telefonu yok
// TKey ve TValue tipini belirtmek zorunda değilsiniz
Console.WriteLine(SetDefault(phonebook, "Sarah", "No Phone")); // 212 555 5555
// LAMBDA IFADELERİ - satır içinde kod yazmanıza olanak sağlar
Func<int, int> square = (x) => x * x; // Son T nesnesi dönüş değeridir
Console.WriteLine(square(3)); // 9
// TEK KULLANIMLIK KAYNAK YÖNETİMİ - Yönetilemeyen kaynakların üstesinden kolayca gelebilirsiniz.
// Bir çok obje yönetilemeyen kaynaklara (dosya yakalama, cihaz içeriği, vb.)
// IDisposable arabirimi ile erişebilir. Using ifadesi sizin için IDisposable objeleri temizler.
using (StreamWriter writer = new StreamWriter("log.txt"))
{
writer.WriteLine("Nothing suspicious here");
// Bu bölümün sonunda kaynaklar temilenir.
// Hata fırlatılmış olsa bile.
}
// PARALEL FRAMEWORK
// http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx
var websites = new string[] {
"http://www.google.com", "http://www.reddit.com",
"http://www.shaunmccarthy.com"
};
var responses = new Dictionary<string, string>();
// Her istek farklı bir thread de işlem görecek
// bir sonraki işleme geçmeden birleştirilecek.
Parallel.ForEach(websites,
new ParallelOptions() {MaxDegreeOfParallelism = 3}, // en fazla 3 thread kullanmak için
website =>
{
// Uzun sürecek bir işlem yapın
using (var r = WebRequest.Create(new Uri(website)).GetResponse())
{
responses[website] = r.ContentType;
}
});
// Bütün istekler tamamlanmadan bu döndü çalışmayacaktır.
foreach (var key in responses.Keys)
Console.WriteLine("{0}:{1}", key, responses[key]);
// DİNAMİK OBJELER (diğer dillerle çalışırken kullanmak için uygun)
dynamic student = new ExpandoObject();
student.FirstName = "First Name"; // Önce yeni bir sınıf tanımlamanız gerekmez!
// Hatta metod bile ekleyebilirsiniz (bir string döner, ve bir string alır)
student.Introduce = new Func<string, string>(
(introduceTo) => string.Format("Hey {0}, this is {1}", student.FirstName, introduceTo));
Console.WriteLine(student.Introduce("Beth"));
// IQUERYABLE<T> - neredeyse bütün koleksiyonlar bundan türer, bu size bir çok
// kullanışlı Map / Filter / Reduce stili metod sağlar.
var bikes = new List<Bicycle>();
bikes.Sort(); // Dizi sıralama
bikes.Sort((b1, b2) => b1.Wheels.CompareTo(b2.Wheels)); // Wheels baz alınarak sıralama
var result = bikes
.Where(b => b.Wheels > 3) // Filters- chainable (bir önceki tipin IQueryable'ını döner)
.Where(b => b.IsBroken && b.HasTassles)
.Select(b => b.ToString()); // Map - sadece bunu seçiyoruz, yani sonuç bir IQueryable<string> olacak
var sum = bikes.Sum(b => b.Wheels); // Reduce - koleksiyonda bulunan bütün wheel değerlerinin toplamı
// Bike içindeki bazı parametreleri baz alarak bir liste oluşturmak
var bikeSummaries = bikes.Select(b=>new { Name = b.Name, IsAwesome = !b.IsBroken && b.HasTassles });
// Burada göstermek zor ama, compiler yukaridaki tipleri çözümleyebilirse derlenmeden önce tipi verebilir.
foreach (var bikeSummary in bikeSummaries.Where(b => b.IsAwesome))
Console.WriteLine(bikeSummary.Name);
// ASPARALLEL
// Linq ve paralel işlemlerini birleştirme
var threeWheelers = bikes.AsParallel().Where(b => b.Wheels == 3).Select(b => b.Name);
// bu paralel bir şekilde gerçekleşecek! Threadler otomatik ve sihirli bir şekilde işleri paylaşacak!
// Birden fazla çekirdeğiniz varsa büyük veri setleri ile kullanmak için oldukça uygun bir yapı.
// LINQ - IQueryable<T> objelerini mapler ve saklar, gecikmeli bir işlemdir
// e.g. LinqToSql - veri tabanını mapler, LinqToXml xml dökümanlarını mapler.
var db = new BikeRepository();
// işlem gecikmelidir, bir veri tabanı üzerinde sorgulama yaparken harikadır.
var filter = db.Bikes.Where(b => b.HasTassles); // sorgu henüz çalışmadı
if (42 > 6) // Filtreler eklemeye devam edebilirsiniz - ileri düzey arama fonksiyonları için harikadır
filter = filter.Where(b => b.IsBroken); // sorgu henüz çalışmadı
var query = filter
.OrderBy(b => b.Wheels)
.ThenBy(b => b.Name)
.Select(b => b.Name); // hala sorgu çalışmadı
// Şimdi sorgu çalışıyor, reader'ı açar ama sadece sizin sorgunuza uyanlar foreach döngüsüne girer.
foreach (string bike in query)
Console.WriteLine(result);
}
} // LearnCSharp sınıfının sonu
// Bir .cs dosyasına diğer sınıflarıda dahil edebilirsiniz
public static class Extensions
{
// UZANTI FONKSİYONLARI
public static void Print(this object obj)
{
Console.WriteLine(obj.ToString());
}
}
// Sınıf Tanımlama Sözdizimi:
// <public/private/protected/internal> class <sınıf ismi>{
// //veri alanları, kurucular , fonksiyonlar hepsi içindedir.
// //Fonksiyonlar Java'daki gibi metod olarak çağırılır.
// }
public class Bicycle
{
// Bicycle'ın Alanları/Değişkenleri
public int Cadence // Public: herhangi bir yerden erişilebilir
{
get // get - değeri almak için tanımlanan metod
{
return _cadence;
}
set // set - değer atamak için tanımlanan metod
{
_cadence = value; // Değer setter'a gönderilen value değeridir
}
}
private int _cadence;
protected virtual int Gear // Protected: Sınıf ve alt sınıflar tarafından erişilebilir
{
get; // bir üye alanına ihtiyacınız yok, bu otomatik olarak bir değer oluşturacaktır
set;
}
internal int Wheels // Internal: Assembly tarafından erişilebilir
{
get;
private set; // Nitelik belirleyicileri get/set metodlarında atayabilirsiniz
}
int _speed; // Her şey varsayılan olarak private'dır : Sadece sınıf içinden erişilebilir.
// İsterseniz yinede private kelimesini kullanabilirsiniz.
public string Name { get; set; }
// Enum sabitler kümesinden oluşan bir değer tipidir.
// Gerçekten sadece bir isim ile bir değeri tutmak için kullanılır. (aksi belirtilmedikçe bir int'dir).
// İzin verilen enum tipleri şunlardır byte, sbyte, short, ushort, int, uint, long, veya ulong.
// Bir enum aynı değeri birden fazla sayıda barındıramaz.
public enum BikeBrand
{
AIST,
BMC,
Electra = 42, // bir isme tam bir değer verebilirsiniz
Gitane // 43
}
// Bu tipi Bicycle sınıfı içinde tanımladığımız için bu bir bağımlı tipdir.
// Bu sınıf dışında kullanmak için tipi Bicycle.Brand olarak kullanmamız gerekir
public BikeBrand Brand; // Enum tipini tanımladıktan sonra alan tipini tanımlayabiliriz
// Static üyeler belirli bir obje yerine kendi tipine aittir
// Onlara bir obje referans göstermeden erişebilirsiniz:
// Console.WriteLine("Bicycles created: " + Bicycle.bicyclesCreated);
static public int BicyclesCreated = 0;
// readonly değerleri çalışma zamanında atanır
// onlara sadece tanımlama yapılarak ya da kurucular içinden atama yapılabilir
readonly bool _hasCardsInSpokes = false; // read-only private
// Kurucular sınıf oluşturmanın bir yoludur
// Bu bir varsayılan kurucudur.
public Bicycle()
{
this.Gear = 1; // bu objenin üyelerine this anahtar kelimesi ile ulaşılır
Cadence = 50; // ama her zaman buna ihtiyaç duyulmaz
_speed = 5;
Name = "Bontrager";
Brand = BikeBrand.AIST;
BicyclesCreated++;
}
// Bu belirlenmiş bir kurucudur. (argümanlar içerir)
public Bicycle(int startCadence, int startSpeed, int startGear,
string name, bool hasCardsInSpokes, BikeBrand brand)
: base() // önce base'i çağırın
{
Gear = startGear;
Cadence = startCadence;
_speed = startSpeed;
Name = name;
_hasCardsInSpokes = hasCardsInSpokes;
Brand = brand;
}
// Kurucular zincirleme olabilir
public Bicycle(int startCadence, int startSpeed, BikeBrand brand) :
this(startCadence, startSpeed, 0, "big wheels", true, brand)
{
}
// Fonksiyon Sözdizimi:
// <public/private/protected> <dönüş tipi> <fonksiyon ismi>(<argümanlar>)
// sınıflar getter ve setter'ları alanları için kendisi uygular
// veya kendisi özellikleri uygulayabilir (C# da tercih edilen yol budur)
// Metod parametreleri varsayılan değerlere sahip olabilir.
// Bu durumda, metodlar bu parametreler olmadan çağırılabilir.
public void SpeedUp(int increment = 1)
{
_speed += increment;
}
public void SlowDown(int decrement = 1)
{
_speed -= decrement;
}
// properties get/set values
// when only data needs to be accessed, consider using properties.
// properties may have either get or set, or both
private bool _hasTassles; // private variable
public bool HasTassles // public accessor
{
get { return _hasTassles; }
set { _hasTassles = value; }
}
// You can also define an automatic property in one line
// this syntax will create a backing field automatically.
// You can set an access modifier on either the getter or the setter (or both)
// to restrict its access:
public bool IsBroken { get; private set; }
// Properties can be auto-implemented
public int FrameSize
{
get;
// you are able to specify access modifiers for either get or set
// this means only Bicycle class can call set on Framesize
private set;
}
// It's also possible to define custom Indexers on objects.
// All though this is not entirely useful in this example, you
// could do bicycle[0] which yields "chris" to get the first passenger or
// bicycle[1] = "lisa" to set the passenger. (of this apparent quattrocycle)
private string[] passengers = { "chris", "phil", "darren", "regina" }
public string this[int i]
{
get {
return passengers[i];
}
set {
return passengers[i] = value;
}
}
//Method to display the attribute values of this Object.
public virtual string Info()
{
return "Gear: " + Gear +
" Cadence: " + Cadence +
" Speed: " + _speed +
" Name: " + Name +
" Cards in Spokes: " + (_hasCardsInSpokes ? "yes" : "no") +
"\n------------------------------\n"
;
}
// Methods can also be static. It can be useful for helper methods
public static bool DidWeCreateEnoughBycles()
{
// Within a static method, we only can reference static class members
return BicyclesCreated > 9000;
} // If your class only needs static members, consider marking the class itself as static.
} // end class Bicycle
// PennyFarthing is a subclass of Bicycle
class PennyFarthing : Bicycle
{
// (Penny Farthings are those bicycles with the big front wheel.
// They have no gears.)
// calling parent constructor
public PennyFarthing(int startCadence, int startSpeed) :
base(startCadence, startSpeed, 0, "PennyFarthing", true, BikeBrand.Electra)
{
}
protected override int Gear
{
get
{
return 0;
}
set
{
throw new ArgumentException("You can't change gears on a PennyFarthing");
}
}
public override string Info()
{
string result = "PennyFarthing bicycle ";
result += base.ToString(); // Calling the base version of the method
return result;
}
}
// Interfaces only contain signatures of the members, without the implementation.
interface IJumpable
{
void Jump(int meters); // all interface members are implicitly public
}
interface IBreakable
{
bool Broken { get; } // interfaces can contain properties as well as methods & events
}
// Class can inherit only one other class, but can implement any amount of interfaces
class MountainBike : Bicycle, IJumpable, IBreakable
{
int damage = 0;
public void Jump(int meters)
{
damage += meters;
}
public bool Broken
{
get
{
return damage > 100;
}
}
}
/// <summary>
/// Used to connect to DB for LinqToSql example.
/// EntityFramework Code First is awesome (similar to Ruby's ActiveRecord, but bidirectional)
/// http://msdn.microsoft.com/en-us/data/jj193542.aspx
/// </summary>
public class BikeRepository : DbSet
{
public BikeRepository()
: base()
{
}
public DbSet<Bicycle> Bikes { get; set; }
}
} // End Namespace
```
## Topics Not Covered
* Flags
* Attributes
* Static properties
* Exceptions, Abstraction
* ASP.NET (Web Forms/MVC/WebMatrix)
* Winforms
* Windows Presentation Foundation (WPF)
## Further Reading
* [DotNetPerls](http://www.dotnetperls.com)
* [C# in Depth](http://manning.com/skeet2)
* [Programming C#](http://shop.oreilly.com/product/0636920024064.do)
* [LINQ](http://shop.oreilly.com/product/9780596519254.do)
* [MSDN Library](http://msdn.microsoft.com/en-us/library/618ayhy6.aspx)
* [ASP.NET MVC Tutorials](http://www.asp.net/mvc/tutorials)
* [ASP.NET Web Matrix Tutorials](http://www.asp.net/web-pages/tutorials)
* [ASP.NET Web Forms Tutorials](http://www.asp.net/web-forms/tutorials)
* [Windows Forms Programming in C#](http://www.amazon.com/Windows-Forms-Programming-Chris-Sells/dp/0321116208)
[C# Coding Conventions](http://msdn.microsoft.com/en-us/library/vstudio/ff926074.aspx)
|