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.
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 }
}
}
Başvuru türü bir üye söz konusu olduğunda, bir operand kopyalandığında yalnızca üye örneğine yapılan 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.
C# dil belirtimi
Daha fazla bilgi için kayıtları özellik teklifi notu içerisindekinumaralı aşağıdaki bölümlere bakın: