.NET 8.0'daki yenilikler [6]: C# 12.0'da salt okunur referans

Adanali

Member
.NET 8.0'daki C# dilinin on ikinci sürümünden başlayarak, yöntem parametreleri için bir değiştirici de tanıtıldı ref readonly. Bu eklemeyle yöntemin alınan değeri veya alınan nesne referansını değiştirmesine izin verilmez. Referans türlerini aktarırken ref readonly Ancak yöntem yine de bireysel nesnenin içeriğini değiştirebilir.

Duyuru








Dr. Holger Schwichtenberg, son derece kritik güvenlikle ilgili alanlar da dahil olmak üzere yenilik ve deneyime dayalı yazılım geliştirme sunan MAXIMAGO'da baş teknoloji uzmanıdır. Aynı zamanda, 43 tanınmış uzmanla yazılım geliştirme ve kullanımı konusunda danışmanlık ve eğitim vererek çok sayıda orta ve büyük ölçekli şirketi destekleyen www.IT-Visions.de uzman ağını da yönetmektedir.







Aşağıdaki tablo sağlar ref readonly diğer parametre değiştiricilerle karşılaştırıldığında. Davranış için önemli olan, parametre olarak bir değer tipinin mi yoksa bir referans tipinin mi iletildiğidir:

Parametre değerin türüdür
Parametre referans türüdür

Yöntem değeri değiştirebilir​

Yöntem, iletilen nesnedeki bireysel değerleri değiştirebilir​

Yöntem yeni bir nesne atayabilir​
Değiştiriciler olmadan geç

Evet, ancak arayan kişi yeni değeri almıyor​

EVET​

Evet, ancak arayan kişi yeni nesneyi almıyor​
Teslimat

HAYIR​

EVET​

HAYIR​
Ref ile teslimat

EVET​

EVET​

EVET​
Salt okunur ref ile geçiş (C# 12.0'dan beri)

HAYIR​

EVET​

HAYIR​
olmadan teslimat

EVET​

EVET​

EVET​

Aşağıdaki üç liste, ekrandaki ilgili çıktının ekran görüntüsünü içeren örnekleri göstermektedir.

İlk kod, bir değer türü olarak parametreler için parametre değiştiricilerin etkisini gösterir.


/// <summary>
/// Wertetypen an Methode übergeben
/// </summary>
public void ParameterValueTypes()
{
CUI.H2(nameof(ParameterValueTypes));
#region
int a = 10;
int b = 20;
int c = 30;
int d = 40;
int e = 50;
CUI.H3("Der Aufrufer hat vorher folgende Werte:");
Console.WriteLine(a + ";" + b + ";" + c + ";" + d + ";" + e);
string r = ParameterDemoValueTypes(a, b, ref c, ref d, out e);
CUI.H3("Die Methode hat folgende Werte:");
Console.WriteLine(r); // 11;20;31;40
CUI.H3("Der Aufrufer hat nachher folgende Werte:");
Console.WriteLine(a + ";" + b + ";" + c + ";" + d + ";" + e);
#endregion
}

public string ParameterDemoValueTypes(int WertValue, in int WertIn,
ref int WertRef,
ref readonly int WertRefRO,
out int WertOut)
{
WertValue++;
// nicht erlaubt, da in-Wert: WertIn++;
WertRef++;
// WertRefRO++; // nicht erlaubt, da readonly
// nicht erlaubt, da noch nicht initialisiert: WertOut++;
WertOut = 41;
return WertValue.ToString() + ";" + WertIn.ToString() + ";"
+ WertRef.ToString() + ";" + WertOut.ToString();
}



Kod aşağıdaki çıktıyı üretir:








(Fotoğraf: Holger Schwichtenberg)



Aşağıdaki listede referans tipi parametresi olarak bir parametre kullanılmaktadır (class Counter). Yöntem, nesnedeki değeri değiştirir.


class Counter
{
public string Name { get; set; }
public int Value { get; set; }
public override string ToString() => Name + "=" + Value;
}

/// <summary>
/// Referenztypen an Methode übergeben, die Wert in dem Objekt ändert
/// </summary>
public void ParameterReferenceType1()
{
CUI.H2(nameof(ParameterReferenceType1));
Counter a = new Counter() { Name = "a", Value = 10 };
Counter b = new Counter() { Name = "b", Value = 20 };
Counter c = new Counter() { Name = "c", Value = 30 };
Counter d = new Counter() { Name = "d", Value = 40 };
Counter e = new Counter() { Name = "e", Value = 50 };
CUI.H3("Der Aufrufer hat vorher folgende Werte:");
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
Console.WriteLine(e);
string r = ParameterDemoRef1(a, b, ref c, ref d, out e);
CUI.H3("Die Methode hat folgende Werte:");
Console.WriteLine(r);
CUI.H3("Der Aufrufer hat nachher folgende Werte:");
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
Console.WriteLine(e);
}

public string ParameterDemoRef1(Counter WertValue, in Counter WertIn,
ref Counter WertRef,
ref readonly Counter WertRefRO,
out Counter WertOut)
{
WertValue.Value++;
WertIn.Value++;
WertRef.Value++;
WertRefRO.Value++;
WertOut = new Counter { Name = "d", Value = 41 };
return WertValue.ToString() + ";" + WertRef.ToString() + ";"
+ WertIn.ToString() + ";" + WertOut.ToString();
}



Kod aşağıdaki çıktıyı üretir:








(Fotoğraf: Holger Schwichtenberg)



Üçüncü örnekte parametre bir referans türüdür (class Counter). Yöntem nesne referansını değiştirir


class Counter
{
public string Name { get; set; }
public int Value { get; set; }
public override string ToString() => Name + "=" + Value;
}

/// <summary>
/// Referenztypen an Methode übergeben, die neues Objekt zuweist und ändert
/// </summary>
public void ParameterReferenceType2()
{
CUI.H2(nameof(ParameterReferenceType2));
Counter a = new Counter() { Name = "a", Value = 10 };
Counter b = new Counter() { Name = "b", Value = 20 };
Counter c = new Counter() { Name = "c", Value = 30 };
Counter d = new Counter() { Name = "d", Value = 40 };
Counter e = new Counter() { Name = "e", Value = 50 };
CUI.H3("Der Aufrufer hat vorher folgende Werte:");
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
Console.WriteLine(e);
string r = ParameterDemoRef2(a, b, ref c, ref d, out e);
CUI.H3("Die Methode hat folgende Werte:");
Console.WriteLine(r);
CUI.H3("Der Aufrufer hat nachher folgende Werte:");
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
Console.WriteLine(e);
}

public string ParameterDemoRef2(Counter WertValue, in Counter WertIn,
ref Counter WertRef,
ref readonly Counter WertRefRO,
out Counter WertOut)
{
WertValue = new Counter { Name = "a*", Value = 101 };
// nicht erlaubt:
// WertIn = new Counter { Name = "b*", Value = 100 };
WertRef = new Counter { Name = "c*", Value = 102 };
// nicht erlaubt, da readonly:
// WertRefRO = new Counter { Name = "c*", Value = 103 };
WertOut = new Counter { Name = "d*", Value = 104 };
return WertValue.ToString() + ";" + WertRef.ToString() + ";"
+ WertIn.ToString() + ";" + WertOut.ToString();
}



Kod aşağıdaki çıktıyı üretir:








(Fotoğraf: Holger Schwichtenberg)




(kendim)



Haberin Sonu
 
Üst