yılında belirleyiciler C# yapılar ve arabirimler arasında garip bir fark (bana göre) bir ortaya çıktı. Bu arayüzü ve yapı düşünün: Ben özelliği olarak bir numarası ile yeni bir sınıf oluşturduğunuzdaC# getters/yapılar ve arayüzleri
public interface INumber
{
void ChangeNumber(int n);
void Log();
}
public struct Number : INumber
{
private int n;
public void ChangeNumber(int n)
{
this.n = n;
}
public void Log()
{
Console.WriteLine(this.n);
}
}
, 2'ye n değiştirebilir ve Log kullanarak numarayı yazdırmak için ChangeNumber yöntemini kullanın, bunun yerine 0 yazdırır:
public class NumberContainer
{
public Number Number { get; set; }
public NumberContainer()
{
this.Number = new Number();
this.Number.ChangeNumber(2);
this.Number.Log(); //prints 0...
}
}
Bir süre sonra farkettim ki, this.Number.ChangeNumber(2);
'u aradığımda, aslında yeni bir nesne (alıcıdan dolayı) oluşturuyorum ve bu sayıyı 2 olarak değiştirdim. Ama sonra Numarayı değiştirerek biraz değiştirdim. Bir MÜHENDİSLİK mülküne mülk:
public class NumberContainer
{
public INumber Number { get; set; }
public NumberContainer()
{
this.Number = new Number();
this.Number.ChangeNumber(2);
this.Number.Log(); //prints 2!
}
}
Bu durumda, 2 yazdırır! Bu neden oluyor? Arabirim için aynı prensipler geçerli değil mi?
Arabirim olarak başvurulduğunda kutulanır. Ama genel olarak, yapıları imtiyazlı hale getirmek en iyisidir ya da katlanılabilirliğe ihtiyacınız varsa, onu bir sınıf yapmalısınız. – juharr