.NET 8.0'da yeni [6]: Refonly Refonly C# 12.0

Womanne

Member
C# in .NET 8.0'ın dil versiyonundan, yöntemin parametreleri için değiştirici de vardı ref readonly. Bu ekleme ile yöntem, alınan değeri veya alınan referansı değiştirmemelidir. Referans türleri teslim edildiğinde ref readonly Ancak, yöntem tek tek nesnenin içeriğini değiştirmeye devam edebilir.










Holger Schwichtenberg, 53 ünlü uzmanla tavsiye ve eğitim yoluyla ve yazılımın geliştirilmesinde çok sayıda orta ve büyük şirketi destekleyen uzmanlar ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası uzman konferansındaki görünümleri, 90'dan fazla uzman kitabı ve 1.500'den fazla uzman makalesi sayesinde Holger Schwichtenberg, Almanya'daki .NET ve Web teknikleri için en iyi uzmanlardan biridir.







Aşağıdaki tablo temsil eder ref readonly Ön tarafta diğer parametre değiştiriciler. Bir parametre olarak bir tür veya bir referans türü verilip verilmediği davranış için önemlidir:

Parametre değer türüdür
Parametre bir referans türüdür

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

Yöntem, aktarılan nesnedeki ayrı değerleri değiştirebilir​

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

Evet, ama arayan yeni değeri alamıyor​

EVET​

Evet, ama arayan yeni nesneyi alamıyor​
İle teslimat

HAYIR​

EVET​

HAYIR​
Ref.

EVET​

EVET​

EVET​
Refonly Refony ile Teslim (C# 12.0'dan)

HAYIR​

EVET​

HAYIR​
Olmadan teslimatlar

EVET​

EVET​

EVET​

Aşağıdaki üç liste, ilgili ekran masraflarının bir ekran görüntüsü dahil örneklerini gösterir.

İlk kod, parametreler için parametrelerin değiştiricilerinin bir değer türü olarak 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 baskıyı oluşturur:










(Resim: Holger Schwichtenberg)



Aşağıdaki listede referans parametre türü olarak bir parametre kullanı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 baskıyı oluşturur:








(Resim: Holger Schwichtenberg)



Üçüncü örnekte, parametre bir referans türüdür (class Counter). Yöntem nesnenin 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 baskıyı oluşturur:








(Resim: Holger Schwichtenberg)




(RME)
 
Üst