Verziószámozás c nyelven#
Ebben az oktatóanyagban megtudhatja, mit jelent a verziószámozás a .NET-ben. Megismerheti azokat a tényezőket is, amelyeket figyelembe kell vennie a tár verziószámozása, valamint a tár új verziójára való frissítés során.
Nyelvi verzió
A C#-fordító a .NET SDK része. A fordító alapértelmezés szerint a projekthez választott TFM-nek megfelelő C#-nyelvi verziót választja ki. Ha az SDK-verzió nagyobb, mint a választott keretrendszer, a fordító nagyobb nyelvi verziót használhat. Az alapértelmezett beállítást a projekt elemének LangVersion
beállításával módosíthatja. A fordítási lehetőségekről szóló cikkünkből megtudhatja, hogyan.
Figyelmeztetés
LangVersion
Az elem latest
beállítása nem ajánlott. A latest
beállítás azt jelenti, hogy a telepített fordító a legújabb verzióját használja. Ez gépről gépre változhat, így a buildek megbízhatatlanok lesznek. Emellett olyan nyelvi funkciókat is lehetővé tesz, amelyekhez futásidejű vagy tárfunkciókra lehet szükség, amelyek nem szerepelnek az aktuális SDK-ban.
Kódtárak készítése
Fejlesztőként, aki nyilvános használatra hozott létre .NET-kódtárakat, nagy valószínűséggel olyan helyzetekben volt, amikor új frissítéseket kell létrehoznia. A folyamat menete sokat számít, mivel gondoskodnia kell arról, hogy a meglévő kód zökkenőmentesen átálljon a kódtár új verziójára. Az alábbi szempontokat érdemes figyelembe venni egy új kiadás létrehozásakor:
Szemantikus verziószámozás
A szemantikus verziószámozás (röviden SemVer) a kódtár verzióira alkalmazott elnevezési konvenció, amely konkrét mérföldköves eseményeket jelez. Ideális esetben a kódtár által megadott verzióinformációknak segíteniük kell a fejlesztőknek annak megállapításában, hogy az adott kódtár régebbi verzióit használó projektjeik kompatibilisek-e.
A SemVer legalapvetőbb megközelítése a 3 összetevő formátuma MAJOR.MINOR.PATCH
, ahol:
MAJOR
inkompatibilis API-módosítások végrehajtásakor növekszikMINOR
a funkció visszamenőlegesen kompatibilis hozzáadásakor növekszikPATCH
a visszafelé kompatibilis hibajavítások létrehozásakor növekszik
A .NET-tár verzióinformációinak alkalmazásakor más forgatókönyveket is megadhat, például a kiadás előtti verziókat.
Visszamenőleges kompatibilitás
A kódtár új verzióinak kiadásakor valószínűleg a korábbi verziókkal való kompatibilitás lesz az egyik fő probléma. A kódtár új verziója kompatibilis az előző verzióval, ha az előző verziótól függő kód újrafordításkor képes az új verzióval dolgozni. A kódtár új verziója binárisan kompatibilis, ha egy, a régi verziótól függő alkalmazás újrafordítás nélkül használhatja az új verziót.
Az alábbi szempontokat érdemes figyelembe venni a kódtár régebbi verzióival való kompatibilitás fenntartásakor:
- Virtuális metódusok: Ha az új verzióban nem virtuális virtuális metódust készít, az azt jelenti, hogy a metódust felülíró projekteket frissíteni kell. Ez egy hatalmas törés változás, és erősen elriasztja.
- Metódus-aláírások: A metódus viselkedésének frissítésekor az aláírását is módosítania kell, ehelyett túlterhelést kell létrehoznia, hogy a metódusba behívott kód továbbra is működjön. A régi metódus-aláírást bármikor módosíthatja, hogy behívja az új metódus-aláírást, hogy a végrehajtás konzisztens maradjon.
- Elavult attribútum: A kódban ezt az attribútumot használhatja elavult osztályok vagy osztálytagok megadására, amelyek a későbbi verziókban valószínűleg el lesznek távolítva. Ez biztosítja, hogy a kódtárat használó fejlesztők jobban felkészüljenek a kompatibilitástörő változásokra.
- Választható metódusargumentumok: Ha a korábban választható metódusargumentumokat kötelezővé teszi, vagy módosítja az alapértelmezett értéket, akkor az argumentumokat nem tartalmazó összes kódot frissíteni kell.
Feljegyzés
A kötelező argumentumok megadása nem kötelező, különösen akkor, ha nem változtatja meg a metódus viselkedését.
Minél könnyebben frissíthet a felhasználók a tár új verziójára, annál valószínűbb, hogy előbb fognak frissíteni.
Alkalmazáskonfigurációs fájl
.NET-fejlesztőként nagy az esély arra, hogy a app.config
legtöbb projekttípusban megtalálható fájllal találkozott.
Ez az egyszerű konfigurációs fájl sokat segíthet az új frissítések bevezetésének javításában. A kódtárakat általában úgy kell megtervezni, hogy a valószínűleg rendszeresen változó információk a fájlban app.config
legyenek tárolva, így az ilyen információk frissítésekor a régebbi verziók konfigurációs fájlját csak az újra kell cserélni anélkül, hogy újra kellene állítani a tárat.
Kódtárak felhasználása
Olyan fejlesztőként, aki más fejlesztők által készített .NET-kódtárakat használ, nagy valószínűséggel tisztában van azzal, hogy a kódtár új verziója nem feltétlenül kompatibilis a projekttel, és gyakran előfordulhat, hogy frissítenie kell a kódot, hogy működjön ezekkel a módosításokkal.
Szerencséje van, a C# és a .NET-ökoszisztéma olyan funkciókkal és technikákkal rendelkezik, amelyek lehetővé teszik, hogy egyszerűen frissítsük az alkalmazást a kódtárak új verzióival való együttműködésre, amelyek kompatibilitástörő változásokat eredményezhetnek.
Szerelvénykötés átirányítása
Az app.config fájllal frissítheti az alkalmazás által használt tár verzióját. Az úgynevezett kötésátirányítás hozzáadásával az alkalmazás újrafordítása nélkül használhatja az új kódtár-verziót. Az alábbi példa bemutatja, hogyan frissítené az alkalmazás app.config fájlját, hogy az eredetileg lefordított verzió helyett a 1.0.0
1.0.1
patch verziót ReferencedLibrary
használja.
<dependentAssembly>
<assemblyIdentity name="ReferencedLibrary" publicKeyToken="32ab4ba45e0a69a1" culture="en-us" />
<bindingRedirect oldVersion="1.0.0" newVersion="1.0.1" />
</dependentAssembly>
Feljegyzés
Ez a megközelítés csak akkor működik, ha az új verzió ReferencedLibrary
binárisan kompatibilis az alkalmazással.
A kompatibilitás meghatározásakor a fenti Visszamenőleges kompatibilitás című szakaszból megtudhatja, hogy milyen változásokra kell figyelnie.
Új...
A módosítóval new
elrejtheti az alaposztály örökölt tagjait. A származtatott osztályok így reagálhatnak az alaposztályok frissítéseire.
Vizsgálja meg az alábbi példát:
public class BaseClass
{
public void MyMethod()
{
Console.WriteLine("A base method");
}
}
public class DerivedClass : BaseClass
{
public new void MyMethod()
{
Console.WriteLine("A derived method");
}
}
public static void Main()
{
BaseClass b = new BaseClass();
DerivedClass d = new DerivedClass();
b.MyMethod();
d.MyMethod();
}
Hozam
A base method
A derived method
A fenti példában láthatja, hogyan DerivedClass
rejti el a metódus a MyMethod
következőben BaseClass
: .
Ez azt jelenti, hogy ha egy erőforrástár új verziójában egy alaposztály hozzáad egy olyan tagot, amely már létezik a származtatott osztályban, egyszerűen használhatja a new
származtatott osztálytag módosítóját az alaposztálytag elrejtéséhez.
Ha nincs new
megadva módosító, a származtatott osztály alapértelmezés szerint elrejti az ütköző tagokat egy alaposztályban, bár a fordító figyelmeztetést fog generálni, amely továbbra is lefordítja a kódot. Ez azt jelenti, hogy ha egyszerűen új tagokat ad hozzá egy meglévő osztályhoz, akkor a kódtár új verziója forrásként és binárisan is kompatibilis lesz az attól függő kóddal.
átgázol
A override
módosító azt jelenti, hogy a származtatott implementáció nem elrejti, hanem kibővíti egy alaposztálytag implementálását. Az alaposztály tagjának alkalmaznia kell a virtual
módosítót.
public class MyBaseClass
{
public virtual string MethodOne()
{
return "Method One";
}
}
public class MyDerivedClass : MyBaseClass
{
public override string MethodOne()
{
return "Derived Method One";
}
}
public static void Main()
{
MyBaseClass b = new MyBaseClass();
MyDerivedClass d = new MyDerivedClass();
Console.WriteLine("Base Method One: {0}", b.MethodOne());
Console.WriteLine("Derived Method One: {0}", d.MethodOne());
}
Hozam
Base Method One: Method One
Derived Method One: Derived Method One
A override
módosító kiértékelése fordításkor történik, és a fordító hibát jelez, ha nem talál egy felülbírálandó virtuális tagot.
Ha ismeri a tárgyalt technikákat, és tisztában van azokkal a helyzetekkel, amelyekben használni szeretné őket, hosszú utat fog tenni a tár verziói közötti átmenet enyhítése felé.