class Program
{
public class BaseClass
{
private protected int hiddenValue = 10;
public void AccessFromBaseClass()
{
hiddenValue = 25; // çalışır // ama BaseClass'ın instance'ı bu veriye erişemez.
BaseClass bc = new BaseClass();
bc.hiddenValue = 33; // BaseClass'ın scope'u içindeyiz.
// Burada Baseclass'ın instance'ı
// üzerinden hiddenValue'ye erişebiliriz: Adı üzerinde "private" protected.
// Yani "private" in özelliği.. --> Class içinde erişim.
Console.WriteLine(hiddenValue); // 25
Console.WriteLine(bc.hiddenValue); // 33
}
}
public class DerivedClass : BaseClass
{
public void AccessFromDerivedClass()
{
var baseObject = new BaseClass();
// baseObject.hiddenValue = 5; // Error -->
// hiddenValue can only be accessed by classes derived from BaseClass.
// DİKKAT! -> Base class'ın objesi hiddenValue'ye erişemiyor (private özelliği).
// Aşağıya bak:
//Sadece derived class instance'I (objesi) değiştirebiliyor. Aşağıyı incele.
hiddenValue = 5; // Çalışır... -->
// accessed through the current derived class instance.
//Görüldüğü üzere derivedClass'ın instance'ı hiddenValue ye erişebiliyor.
// adı üzerinde private "protected"....
//Protected özelliğini göstermiş oldu: derived class içinden erişim.
}
}
// Assembly2.cs
// Varsayalım ki:
// Baseclass ve DerivedClass1 --> Assembly1'in içinde bulunuyor.
// Yine varsayalım ki:
// DerivedClass2 Assembly2 içinde bulunuyor.
// Bu durumda DerivedClass2'nin instance'ı hiddenValue'yi değiştiremez.
// Çünkü hiddenValue'yi sadece Assembly1'de bulunan Derived class'lar değiştirebilir -->
// an attempt to access hiddenValue as an inherited member of
// DerivedClass2 will produce an error, as it is
// only accessible by derived types in Assembly1.
public class DerivedClass2 : BaseClass
{
public void Access()
{
hiddenValue = 5; // Hata verirçünkü assembly'ler varsayımımıza göre eşleşmeyecektir.
var baseObject = new BaseClass();
}
}
11 Aralık 2019 Çarşamba
3 Kasım 2019 Pazar
15 Şubat 2019 Cuma
String bir Value Type mı? - Reference Type - Value Type
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. } } }
Kaydol:
Kayıtlar (Atom)