Aracılığıyla paylaş


İfade with - Yok edici olmayan mutasyon değiştirilmiş özelliklere sahip yeni bir nesne oluşturur

İfade with , belirtilen özellikler ve alanlar değiştirilmiş olarak 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ın:

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 ifadenin sol işleneni withbir kayıt türü olabilir. Bir yapı türü veya anonim bir tür de olabilir.

C# dili başvuru belgesi, C# dilinin en son yayımlanan sürümünü gösterir. Ayrıca, yaklaşan dil sürümü için genel önizlemelerdeki özelliklere yönelik ilk belgeleri içerir.

Belgelerde ilk olarak dilin son üç sürümünde veya geçerli genel önizlemelerde sunulan tüm özellikler tanımlanır.

Tavsiye

Bir özelliğin C# dilinde ilk tanıtıldığı zamanları bulmak için C# dil sürümü geçmişi makalesine bakın.

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, bu üyenin kopyalanması yalnızca bu üye örneğine başvuruyu kopyalar. Hem kopya hem de özgün işlenen aynı başvuru türü örneğine erişer. 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

Her kayıt sınıfı türünün bir kopya oluşturucu vardı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 ifadeyi değerlendirdiğinizde, özgün kaydı temel alan yeni bir kayıt örneği oluşturmak için kopya oluşturucuyu çağırır. Ardından yeni örneği belirtilen değişikliklerle güncelleştirir. Varsayılan olarak, derleyici kopya oluşturucuyu sentezler. Kayıt kopyalama semantiğini özelleştirmek için, 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 kopyalar:

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ştirilmiş 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:

Ayrıca bkz.