SORU
21 EYLÜL 2009, PAZARTESİ


API-son değişiklikler için kesin bir rehber .NET

Mümkün olduğu kadar çok bilgi toplamak için API sürüm ile ilgili istiyorum .NET API değişiklikler yapmak özellikle CLR, ve/veya istemci uygulamalar kırmak değil. Öncelikle bazı terimleri tanımlayalım:

API değiştirin- bir türü, kamu herhangi bir grubun üyeleri de dahil olmak üzere, herkesin görebileceği bir tanımında bir değişiklik. Bu içerir, değişen tür ve üye adları, değişen temel tipi, ekleme/çıkarma arabirimleri listesi uygulanan arabirimleri yazın, ekleme/çıkarma üyeleri de dahil olmak üzere aşırı), değişen üye görünürlük, yeniden adlandırma yöntemi ve parametreleri yazın ekleyerek varsayılan değerler için yöntem parametreleri ekleme/çıkarma nitelikleri türleri ve üyeleri ve ekleme/çıkarma genel tür parametreleri türleri ve üyeleri (bir şey kaçırdım mı?). Bu üye vücudunda herhangi bir değişiklik ya da özel üyeler (yani dikkate almaz, Yansıma) herhangi bir değişiklik içermez.

İkili düzey Ara- istemci derlemeler sonuçları, API bir değişiklik API potansiyel olarak eski sürüm yüklenmiyor karşı derlenmiş yeni sürüm ile. Örnek: eğer (örn: parametre varsayılan değerleri aşırı / döndürme türü) void daha önce olduğu gibi aynı şekilde çağrılacak izin veriyorsa bile yöntem imzası değişiyor.

Kaynak düzey Ara- varolan kodu neden olan bir API değişikliği derlemek için API potansiyel olarak eski sürüm değil derleme karşı yazılı bir yeni sürümü ile. Önceden derlenmiş bir istemci derlemeler daha önce olduğu gibi, ancak iş. Örnek: net önceki. bu yöntem çağrıları karışıklığa neden olabilir yeni bir aşırı yük ekleme

Kaynak düzey sessiz semantik değişiklikmevcut kod API eski sürüm karşı derlemeye yazılı sonuçları, API bir değişiklik sessizce anlambilimi, örneğin farklı bir yöntem çağırarak değiştirin. Kodu ancak hiçbir uyarı/hata ile derlemeye devam etmeli ve önceden derlenmiş derlemeleri daha önce olduğu gibi çalışması gerekir. Örnek: farklı bir aşırı yükleme aşırı yükleme çözümlemesi sırasında. seçilmiş olmanın sonuçları varolan bir sınıfa yeni bir arabirimi uygulama

Nihai hedefi kırma ve sessiz birçok semantiği mümkün olduğunca API değişiklikleri catalogize ve dilleri olan kırılma ve tam etkilerini tanımlama ve etkilenmez. Genişletmek için ikincisi: bazı değişiklikleri etkileyen tüm dillerde evrensel olarak (örneğin, ekleme bir yeni üye için bir arayüz olacak sonu uygulamaları bu arayüz herhangi bir dil), bazı gerektiren çok özel bir dil semantiği içine girmek için oynamak için bir mola. Bu en tipik yöntem aşırı yükleme, ve, genel olarak, hiçbir şey örtülü tip dönüşümleri ile yapmak zorunda içerir. Orada yok görünüyor herhangi bir şekilde tanımlamak için "en küçük ortak payda" burada bile CLS uyumlu diller (yani o uygun en azından kuralları "CLS tüketici" olarak tanımlanan CLİ spec) - ama takdir ederim eğer biri beni düzeltir gibi olması yanlış burada - yani bu olacak gidin dil ile dil. En çok bu ilgi doğal olarak ile gelen olanlardır .Kutunun dışında NET: C#, VB ve F#; ama diğerleri, IronPython, IronRuby gibi, Prizma vb Delphi de alakalı. Daha bir köşesine durumda, daha ilginç olacak - gibi şeyler kaldırma üyeleri oldukça aşikar, ama ince etkileşimleri arasında örneğin, metot aşırı yükleme, isteğe bağlı/Varsayılan parametreleri, lambda tür kesmesi ve dönüşüm operatörleri oldukça şaşırtıcı kez.

Birkaç örnek bu kickstart için:

Yeni yöntem aşırı yükleme ekleme

Tür: kaynak-seviyesi Ara

Etkilenen diller: C#, VB, F#

Değiştirmeden önce API:

public class Foo
{
    public void Bar(IEnumerable x);
}

Değişiklikten sonra API:

public class Foo
{
    public void Bar(IEnumerable x);
    public void Bar(ICloneable x);
}

Örnek client kodu değiştirmeden önce çalışan ve sonra kırık:

new Foo().Bar(new int[0]);

Yeni bir örtük dönüştürme işleç aşırı sözlerine ekledi

Tür: kaynak-seviyesi Ara.

Etkilenen diller: C#, VB

Diller etkilenmez: F#

Değiştirmeden önce API:

public class Foo
{
    public static implicit operator int ();
}

Değişiklikten sonra API:

public class Foo
{
    public static implicit operator int ();
    public static implicit operator float ();
}

Örnek client kodu değiştirmeden önce çalışan ve sonra kırık:

void Bar(int x);
void Bar(float x);
Bar(new Foo());

Notlar: F# kırık değil, çünkü değil, herhangi bir dil seviyesi destek için aşırı yüklü operatörleri, ne açık ne de örtülü - her ikisine de sahip olmak denilen direkt olarak op_Explicit op_Implicit yöntemleri.

Yeni örnek yöntemleri sözlerine ekledi

Tür: kaynak-seviyesi sessiz semantik değişiklik.

Etkilenen diller: C#, VB

Diller etkilenmez: F#

Değiştirmeden önce API:

public class Foo
{
}

Değişiklikten sonra API:

public class Foo
{
    public void Bar();
}

Sessiz semantik bir değişime uğrar istemci kod örneği:

public static class FooExtensions
{
    public void Bar(this Foo foo);
}

new Foo().Bar();

Notlar: F# ExtensionMethodAttribute için dil seviyesi destek olmadığı için kırık, ve CLS uzatma yöntemleri statik yöntemler olarak adlandırılan gerektirir.

CEVAP
24 EYLÜL 2009, PERŞEMBE


Yöntem bir imza değiştirme

Tür: düzey İkili Ara

Etkilenen diller: C# (VB ve F# büyük olasılıkla, ama denenmemiş)

Değiştirmeden önce API

public static class Foo
{
    public static void bar(int i);
}

Değişiklikten sonra API

public static class Foo
{
    public static bool bar(int i);
}

Örnek client kodu değiştirmeden çalışıyor

Foo.bar(13);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Darren Kitchen

    Darren Kitch

    3 EKİM 2011
  • Jeremy Gallman

    Jeremy Gallm

    11 NİSAN 2012
  • Philip DeFranco

    Philip DeFra

    16 EYLÜL 2006