using System;
using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { static void ChangeReferenceType(string str3) { str3 = "Text 3"; } static void ChangeReferenceType(int int3) { int3 = 3; } static void ChangeReferenceType(Student student3) { student3.Name = "Student 3 Name"; } static void ChangeReferenceType(Array array2) { array2 = null; } public class Student { public string Name { get; set; } } static void Main(string[] args) { string str1 = "Text 1"; string str2 = str1; ChangeReferenceType(str1); Console.WriteLine(str1); //Text 1 Console.WriteLine(str2); //Text 1 // metot içindeki değişim durumu değiştirmedi. // Çünkü değişkenlerin Ram lokasyonları farklı. str1 = "Text 2"; Console.WriteLine(str1); //Text 2 Console.WriteLine(str2); //Text 1 Console.WriteLine("---"); // str1 = "Text 2" eşitliği; str2 nin değerini değiştirmedi. // Çünkü yukarıda belirtildiği üzere; // değişkenlerin Ram lokasyonları farklı. // string'in data type'ı --> REFERENCE TYPE'dır. VALUE TYPE DEĞİLDİR. // Tanım: Eğer bir data type; kendi VALUE'sini RAM'in özel // bir lokasyonunda tutuyorsa o bir VALUE TYPE'dır. ( // Yani referans değil; value tutar RAM'de) // Value Type bir değişkeni bir metoda gönderirsek; // değişkenin değerinin KOPYASI GÖNDERİLİR. Yani bu metod; // bu değişkenin değerini değiştiremez, sadece // kendi metodu içinde o yeni değeri kullanabilir; // eski değeri yine eski değişkende kalır. DEĞİŞMEZ. // Örnekte görüldüğü üzere string -> Ram lokasyununa referans yapmadı. //Onun yerine değerini kopyaladı. Böylelikle kendi değeri değişmemiş oldu. //Sonuç: String, bir 'reference type' tan olan bir data type // olmasına rağmen bir value type gibi davrandı (örneğin integer gibi) //String'ler value type gibi davranır! int int1 = 1; int int2 = int1; ChangeReferenceType(int1); Console.WriteLine(int1.ToString()); //1 Console.WriteLine(int2.ToString()); //1 int1 = 2; Console.WriteLine(int1.ToString()); //2 Console.WriteLine(int2.ToString()); //1 Console.WriteLine("---"); // İnteger: Ram lokasyonuna referans yapmadı. // Kendi değerinini kopyaladı. // Böylelikle kendi değeri değişmemiş oldu. // Sonuç: integer bir 'value type' olarak; beklendiği üzere // RAM'de farklı lokasyonlara karşılık geliyor. Student student1 = new Student(); student1.Name = "Student1 Name"; Student student2 = student1; ChangeReferenceType(student1); Console.WriteLine(student1.Name); //Student 3 Name Console.WriteLine(student2.Name); //Student 3 Name Console.WriteLine("---"); // Class: Data Type'ı REFERENCE TYPE'dır. // Yani değeri değil ADRESİ gönderir. // Bu durumda bir metoda bir değişken yollanırsa; // değişkenin ADRESİ yollanır. // Yani iki değişken de RAM'de tek bir noktaya // işaret ettiği için metoddaki işlem, // değişkeni DEĞİŞTİRECEKTİR. string[] array1 = new string[3]; array1[0] = "Data 1"; array1[1] = "Data 2"; array1[2] = "Data 3"; Console.WriteLine(array1[0]); //Data 1 Console.WriteLine(array1[1]); //Data 2 Console.WriteLine(array1[2]); //Data 3 // Array'lar da String'ler gibi çalıştığı için; // doğal olarak onlar gibi davrandı. // Metod içindeki değişim asıl değişkeni değiştirmedi. ChangeReferenceType(array1); //integer: value type //string: reference type //class: reference type //array: reference type string str10 = "String Ten"; str10.ToUpper(); //str10'un bu noktadaki değeri = "STRING TEN" Console.WriteLine(str10); //String Ten // Görüldüğü üzere ToUpper metodunda oluşan değer // bizim değişkenimiz üzerine kaydedilmedi. Neden? // Çünkü string = Reference Type olduğu halde // bir Value Type'mış gibi davranır ve // RAM üzerinde ADRESLEME değil KOPYALAMA yapar. // Yani toUpper metodu yeni bir string değişkeni yarattı // (string'in yeni bir instance'ını oluşturdu ve bu // instance'ı dönderdi: dolayısıyla RAM'da farklı bir // lokasyonda bulunuyor) ve bunun değerini "STRING TEN" // olarak belirledi. Ama bu işlem bizim str10 değişkenimiz // üzerinde bir değişime sebep olmadı. // Çünkü onun RAM'deki lokasyonu farklı. // O halde; ToUpper metodundan çıkan sonucu kullanmak istiyorsak; // yeni bir değişken oluşturup sonucu buna yazdırmamız gerekir: string str20 = str10.ToUpper(); Console.WriteLine(str20); //STRING TEN Console.ReadKey(); // Sonuç: String sanıldığı gibi bir VALUE TYPE değildir. // REFERENCE TYPE'dır ama VALUE TYPE gibi davranır. } } }