C# geliştiricileri için sürüm ve güncelleştirme konusunda dikkat edilmesi gerekenler

C# diline yeni özellikler eklendikçe uyumluluk önemli bir hedeftir. Neredeyse tüm durumlarda, mevcut kod herhangi bir sorun olmadan yeni bir derleyici sürümüyle yeniden derlenebilir. .NET çalışma zamanı ekibinin güncelleştirilmiş kitaplıklar için uyumluluğu sağlama hedefi de vardır. Neredeyse her durumda, uygulamanız güncelleştirilmiş kitaplıklarla güncelleştirilmiş bir çalışma zamanından başlatıldığında, davranış önceki sürümlerle tam olarak aynıdır.

Uygulamanızı derlemek için kullanılan dil sürümü genellikle projenizde başvurulan çalışma zamanı hedef çerçeve adıyla (TFM) eşleşir. Varsayılan dil sürümünü değiştirme hakkında daha fazla bilgi için Dil sürümünüzü yapılandırma başlıklı makaleye bakın. Bu varsayılan davranış en yüksek uyumluluğu sağlar.

Hataya neden olan değişiklikler kullanıma sunulduğunda şu şekilde sınıflandırılır:

  • İkili hataya neden olan değişiklik: İkili hata değişikliği, yeni bir çalışma zamanı kullanılarak başlatıldığında uygulamanızda veya kitaplığınızda kilitlenme gibi farklı davranışlara neden olur. Bu değişiklikleri eklemek için uygulamanızı yeniden derlemeniz gerekir. Mevcut ikili dosya düzgün çalışmaz.
  • Kaynak hataya neden olan değişiklik: Kaynak hataya neden olan değişiklik, kaynak kodunuzun anlamını değiştirir. Uygulamanızı en son dil sürümüyle derlemeden önce kaynak kodu düzenlemeleri yapmanız gerekir. Mevcut ikili dosyanız daha yeni konak ve çalışma zamanıyla doğru şekilde çalışır. Dil söz diziminde kaynak hataya neden olan değişikliğin, çalışma zamanı hataya neden olan değişikliklerde tanımlandığı gibi davranışsal bir değişiklik olduğunu unutmayın.

İkili hataya neden olan bir değişiklik uygulamanızı etkilerse, uygulamanızı yeniden derlemeniz gerekir, ancak herhangi bir kaynak kodunu düzenlemeniz gerekmez. Kaynak hataya neden olan bir değişiklik uygulamanızı etkilediğinde, mevcut ikili dosya güncelleştirilmiş çalışma zamanı ve kitaplıkları olan ortamlarda düzgün çalışmaya devam eder. Ancak, yeni dil sürümü ve çalışma zamanı ile yeniden derlemek için kaynak değişiklikleri yapmanız gerekir. Bir değişiklik hem kaynak hem de ikili hataya neden oluyorsa, uygulamanızı en son sürümle yeniden derlemeli ve kaynak güncelleştirmeleri yapmalısınız.

C# dil takımı ve çalışma zamanı ekibinin hataya neden olan değişikliklerini önleme hedefi nedeniyle, uygulamanızı güncelleştirmek genellikle TFM'yi güncelleştirme ve uygulamayı yeniden derlemeyle ilgili bir konudur. Ancak, genel olarak dağıtılan kitaplıklar için ilkenizi desteklenen TFM'ler ve desteklenen dil sürümleri için dikkatle değerlendirmeniz gerekir. En son sürümde bulunan özelliklere sahip yeni bir kitaplık oluşturuyor olabilirsiniz ve derleyicinin önceki sürümleri kullanılarak oluşturulan uygulamaların bunu kullanabilmesini sağlamanız gerekir. Veya mevcut bir kitaplığı yükseltiyor olabilirsiniz ve kullanıcılarınızın çoğu henüz sürüm yükseltmemiş olabilir.

Kitaplıklarınızda hataya neden olan değişikliklere giriş

Kitaplığınızın genel API'sinde yeni dil özelliklerini benimsediğinizde, özelliği benimsediğinizde kitaplığınızın kullanıcıları için ikili veya kaynak hataya neden olan bir değişiklik olup olmadığını değerlendirmeniz gerekir. İç uygulamanızda veya arabirimlerinde publicprotected görünmeyen tüm değişiklikler uyumludur.

Not

İç üyeleri görmek için türleri etkinleştirmek için kullanırsanız System.Runtime.CompilerServices.InternalsVisibleToAttribute , iç üyeler hataya neden olan değişikliklere neden olabilir.

İkili hataya neden olan bir değişiklik , kullanıcılarınızın yeni sürümü kullanmak için kodlarını yeniden derlemesini gerektirir. Örneğin, şu genel yöntemi göz önünde bulundurun:

public double CalculateSquare(double value) => value * value;

Değiştiriciyi in yöntemine eklerseniz ikili hataya neden olan bir değişiklik olur:

public double CalculateSquare(in double value) => value * value;

Kullanıcıların yeni kitaplığın düzgün çalışması için yöntemini kullanan CalculateSquare tüm uygulamaları yeniden derlemesi gerekir.

Kaynak hataya neden olan bir değişiklik , kullanıcılarınızın yeniden derlemeden önce kodlarını değiştirmesini gerektirir. Örneğin, şu türü göz önünde bulundurun:

public class Person
{
    public string FirstName { get; }
    public string LastName { get; }

    public Person(string firstName, string lastName) => (FirstName, LastName) = (firstName, lastName);

    // other details omitted
}

Daha yeni bir sürümde, türler için record oluşturulan sentezlenmiş üyelerden yararlanmak istiyorsunuz. Aşağıdaki değişikliği yaparsınız:

public record class Person(string FirstName, string LastName);

Önceki değişiklik, türünden Persontüretilen herhangi bir tür için değişiklik gerektirir. Tüm bu bildirimler, değiştiriciyi record bildirimlerine eklemelidir.

Hataya neden olan değişikliklerin etkisi

Kitaplığınıza ikili hataya neden olan bir değişiklik eklediğinizde, kitaplığınızı kullanan tüm projeleri yeniden derlemeye zorlarsınız. Ancak, bu projelerdeki kaynak kodun hiçbirinde değişiklik yapılmasına gerek yoktur. Sonuç olarak, hataya neden olan değişikliğin etkisi her proje için makul ölçüde küçüktür.

Kitaplığınızda kaynak hataya neden olan bir değişiklik yaptığınızda, yeni kitaplığınızı kullanmak için tüm projelerin kaynak değişiklikleri yapmasını gerektirirsiniz. Gerekli değişiklik yeni dil özellikleri gerektiriyorsa, bu projeleri şu anda kullandığınız aynı dil sürümüne ve TFM'ye yükseltmeye zorlarsınız. Kullanıcılarınız için daha fazla çalışma gerektiniz ve muhtemelen onları da yükseltmeye zorladınız.

Yaptığınız herhangi bir hataya neden olan değişikliğin etkisi, kitaplığınıza bağımlılığı olan proje sayısına bağlıdır. Kitaplığınız birkaç uygulama tarafından dahili olarak kullanılıyorsa, etkilenen tüm projelerde hataya neden olan değişikliklere tepki vekleyebilirsiniz. Ancak kitaplığınız genel olarak indiriliyorsa olası etkiyi değerlendirmeniz ve alternatifleri göz önünde bulundurmanız gerekir:

  • Mevcut API'leri paralel hale getiren yeni API'ler ekleyebilirsiniz.
  • Farklı TFM'ler için paralel derlemeler kullanmayı düşünebilirsiniz.
  • Çoklu hedeflemeyi düşünebilirsiniz.