Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
İfade
with ifadesi, belirtilen özelliklerin ve alanların değiştirildiği işleneninin bir kopyasını oluşturur. Hangi üyelerin değiştirileceğini ve yeni değerlerini belirtmek için nesne başlatıcı söz dizimini kullanırsınız:
using System;
public class WithExpressionBasicExample
{
public record NamedPoint(string Name, int X, int Y);
public static void Main()
{
var p1 = new NamedPoint("A", 0, 0);
Console.WriteLine($"{nameof(p1)}: {p1}"); // output: p1: NamedPoint { Name = A, X = 0, Y = 0 }
var p2 = p1 with { Name = "B", X = 5 };
Console.WriteLine($"{nameof(p2)}: {p2}"); // output: p2: NamedPoint { Name = B, X = 5, Y = 0 }
var p3 = p1 with
{
Name = "C",
Y = 4
};
Console.WriteLine($"{nameof(p3)}: {p3}"); // output: p3: NamedPoint { Name = C, X = 0, Y = 4 }
Console.WriteLine($"{nameof(p1)}: {p1}"); // output: p1: NamedPoint { Name = A, X = 0, Y = 0 }
var apples = new { Item = "Apples", Price = 1.19m };
Console.WriteLine($"Original: {apples}"); // output: Original: { Item = Apples, Price = 1.19 }
var saleApples = apples with { Price = 0.79m };
Console.WriteLine($"Sale: {saleApples}"); // output: Sale: { Item = Apples, Price = 0.79 }
}
}
bir with ifadesinin sol işleneni, yapı türü veya bir anonim türolabilir.
Bir with ifadesinin sonucu, ifadenin işleneni ile aynı çalışma zamanı türüne sahiptir, aşağıdaki örnek bunu göstermektedir.
using System;
public class InheritanceExample
{
public record Point(int X, int Y);
public record NamedPoint(string Name, int X, int Y) : Point(X, Y);
public static void Main()
{
Point p1 = new NamedPoint("A", 0, 0);
Point p2 = p1 with { X = 5, Y = 3 };
Console.WriteLine(p2 is NamedPoint); // output: True
Console.WriteLine(p2); // output: NamedPoint { X = 5, Y = 3, Name = A }
}
}
Bir üye bir başvuru türü olduğunda, bir işlenen kopyalandığında yalnızca üye örneğine başvuru kopyalanır. Hem kopya hem de özgün işlenen aynı başvuru türü örneğine erişebilir. Aşağıdaki örnekte bu davranış gösterilmektedir:
using System;
using System.Collections.Generic;
public class ExampleWithReferenceType
{
public record TaggedNumber(int Number, List<string> Tags)
{
public string PrintTags() => string.Join(", ", Tags);
}
public static void Main()
{
var original = new TaggedNumber(1, new List<string> { "A", "B" });
var copy = original with { Number = 2 };
Console.WriteLine($"Tags of {nameof(copy)}: {copy.PrintTags()}");
// output: Tags of copy: A, B
original.Tags.Add("C");
Console.WriteLine($"Tags of {nameof(copy)}: {copy.PrintTags()}");
// output: Tags of copy: A, B, C
}
}
Özel kopyalama semantiği
Herhangi bir kayıt sınıfı türünde kopya oluşturucuvardır.
kopya oluşturucu, içeren kayıt türünün tek parametresine sahip bir oluşturucudur. Parametresinin durumunu yeni bir kayıt örneğine kopyalar. bir with ifadesi değerlendirilirken, özgün bir kaydı temel alan yeni bir kayıt örneğini oluşturmak için kopya oluşturucu çağrılır. Bundan sonra, yeni örnek belirtilen değişikliklere göre güncelleştirilir. Varsayılan olarak, kopya oluşturucu örtük, yani derleyici tarafından oluşturulmuştur. Kayıt kopyalama semantiğini özelleştirmeniz gerekiyorsa, istenen davranışa sahip bir kopya oluşturucuyu açıkça bildirin. Aşağıdaki örnek, önceki örneği açık bir kopya oluşturucuyla güncelleştirir. Yeni kopyalama davranışı, bir kayıt kopyalandığında liste başvurusu yerine liste öğelerini kopyalamaktır:
using System;
using System.Collections.Generic;
public class UserDefinedCopyConstructorExample
{
public record TaggedNumber(int Number, List<string> Tags)
{
protected TaggedNumber(TaggedNumber original)
{
Number = original.Number;
Tags = new List<string>(original.Tags);
}
public string PrintTags() => string.Join(", ", Tags);
}
public static void Main()
{
var original = new TaggedNumber(1, new List<string> { "A", "B" });
var copy = original with { Number = 2 };
Console.WriteLine($"Tags of {nameof(copy)}: {copy.PrintTags()}");
// output: Tags of copy: A, B
original.Tags.Add("C");
Console.WriteLine($"Tags of {nameof(copy)}: {copy.PrintTags()}");
// output: Tags of copy: A, B
}
}
Yapı türleri için kopyalama semantiğini özelleştiremezsiniz.
Önemli
Yukarıdaki örneklerde tüm özellikler bağımsızdır. Özelliklerin hiçbiri diğer özellik değerlerinden hesaplanmış değil. İfade with önce var olan kayıt örneğini kopyalar, ardından ifadede with belirtilen özellikleri veya alanları değiştirir. Türlerdeki record hesaplanan özellikler erişimde hesaplanmalıdır, örnek oluşturulduğunda başlatılmamalıdır. Aksi takdirde, bir özellik değiştirilen kopyayı değil, özgün örneğe göre hesaplanan değeri döndürebilir. Daha fazla bilgi için türler hakkında recorddil başvurusu makalesine bakın.
C# dil belirtimi
Daha fazla bilgi için kayıtları özellik teklifi notu içerisindekinumaralı aşağıdaki bölümlere bakın: