[C#] Version 클래스 분석

System.Version은 버전 정보를 표현하는 클래스 입니다.

버젼은 다음과 같이 표현됩니다.

{major}.{minor}.{build}.{revision}

기본적으로 {major}.{minor}는 표현 되어야 합니다. 빌드 번호 또는 리비젼은 생략 가능합니다.

또한 리비젼MajorRevisionMinorRevision으로 나눠서 관리할 수 있는데 리비젼을 유지한 채 핫픽스 등으로 버젼을 올려야 할 경우 사용합니다.
MajorRevision리비전의 상위 16비트를 사용하고 MinorRevision은 하위 16비트를 사용합니다. 그런데 일반적으로 이렇게까지 쓸 일은 없을 것 같습니다.

Version은 비교할 수 있습니다.

// 버젼 구조 확인
var v1 = Version.Parse("1.2");
var v2 = Version.Parse("1.2.2022");
var v3 = Version.Parse("1.2.2022.2");

Console.WriteLine($"Version: {v3}");
Console.WriteLine($"Major : {v3.Major}");
Console.WriteLine($"Minor : {v3.Minor}");
Console.WriteLine($"Build : {v3.Build}");
Console.WriteLine($"Revision : {v3.Revision}");
Console.WriteLine($"MajorRevision : {v3.MajorRevision}");
Console.WriteLine($"MinorRevision : {v3.MinorRevision}");

Console.WriteLine();

Console.WriteLine($"v1 = {v1}");
Console.WriteLine($"v2 = {v2}");
Console.WriteLine($"v3 = {v3}");

Console.WriteLine($"v1 >= v2 = {v1 >= v2}");
Console.WriteLine($"v1 >= v3 = {v1 >= v3}");
Console.WriteLine($"v2 >= v1 = {v2 >= v1}");
Console.WriteLine($"v2 >= v3 = {v2 >= v3}");
Console.WriteLine($"v3 >= v1 = {v3 >= v1}");
Console.WriteLine($"v3 >= v2 = {v3 >= v2}");

Console.WriteLine();

var v4 = Version.Parse("1.2");
var v5 = Version.Parse("1.2.0");

Console.WriteLine($"v4 = {v4}");
Console.WriteLine($"v5 = {v5}");
Console.WriteLine($"v4 >= v5 = {v4 >= v5}");
Console.WriteLine($"v5 >= v4 = {v5 >= v4}");

| 결과

Version: 1.2.2022.2
Major : 1
Minor : 2
Build : 2022
Revision : 2
MajorRevision : 0
MinorRevision : 2

v1 = 1.2
v2 = 1.2.2022
v3 = 1.2.2022.2
v1 >= v2 = False
v1 >= v3 = False
v2 >= v1 = True
v2 >= v3 = False
v3 >= v1 = True
v3 >= v2 = True

v4 = 1.2
v5 = 1.2.0
v4 >= v5 = False
v5 >= v4 = True

참고로 버젼 "1.0.0"은 버젼 “1.0” 보다 상위 버젼으로 평가됩니다.

3개의 좋아요

image

Version Class는 2~4개의 요소로 구성됩니다.

// 인스턴스 가능한 값?
// 구성요소가 2~4개인 경우
string version = "1.2"
string version = "1.2.3"
string version = "1.2.3.4"
// 인스턴스 불가능
// 구성요소가 2~4개를 충족하지 못하는 경우
string version = "1"
string version = "1.2.3.4.5"

// 숫자외 다른 문자가 오는 경우
string version = "v1.2"
  • DB를 통해 기록하거나 API를 사용하는 경우
  • 그 과정에서 맵핑을하는 경우
    인스턴스?가 불가능할 때 에러가 발생합니다.
    (요약하면 불가능한 값으로 Version으로 변환하는 경우)
  1. DB에 기록된 값이 Null이거나 요상한 값일 경우,
  2. 인스턴스 불가능한 값으로 API 요청하는 경우

string 객체를 Version객체로 변경하는 작업이 꽤나컸네요;;

  • DB 값을 받아 올 때는 AutoMapper.ResolverVersion.TryParse(string, out Version)를 통해서 해결 했습니다.
  • API를 요청할 때에는 마찬가지로 Version.TryParse를 통해 BadRequest`를 반환 할 수 있도록 했습니다.

참조 문서
Version Class
Version.TryParse

Version.TryParse 예제
image

Version Class의 장점, 성능… 그런건 찾아보아도 잘 모르겠네요
Semantic Versioning의 틀을 강제한다?? 정도가 장점인것 같습니다.

  • ( 구성요소 분할 " {major}.{minor}.{build}.{revision} 특정 요소만 가져오거나 서로 비교 할 수 있습니다.)