전체 글

Software, 기타 등등..
C#/WinForm

C# - WinForm - Tabless TabControl (using TCM_ADJUSTRECT)

1. Introduction TabControl은 탭으로 구성된 패널 기능을 제공한다. 간혹 탭페이지를 사용하면서 탭은 필요가 없는 경우가 발생하는데, Win32의 TCM_ADJUSTRECT 메시지를 통해 탭을 제거할 수 있다. Microsoft 문서에서는 TCM_ADJUSTRECT에 대해 다음과 같이 소개한다.창 사각형이 지정된 탭 컨트롤의 표시 영역을 계산하거나 지정된 표시 영역에 해당하는 창 사각형을 계산합니다. 이 메시지를 명시적으로 보내거나 TabCtrl_AdjustRect 매크로를 사용하여 보낼 수 있습니다. 2. Tabless TabControl 탭을 제거하기 위해 WndProc(ref Message)를 오버라이드 한다. public class TablessTabControl : TabCon..

C#/Common

C# - MiniExcel 라이브러리 사용법 (Query, Save)

1. Introduction MiniExcel은 OOM을 피하기 위해 만들어진 .NET 라이브러리이다. Github의 Readme를 보면, 아래와 같이 라이브러리 특징에 대해 소개하고 있다.Features Low memory consumption, avoid OOM (out of memory) and full GC Support operation of each row of data real-time Support LINQ deferred execution, it can do low-consumption, fast paging and other complex queries Lightweight, without Microsoft Office installed, no COM+, DLL size is less ..

C#/Common

C# - Notion API - Create, Retrieve, Update, Archive page (Database)

1. Introduction Notion은 페이지, 데이터베이스 등에 대해 REST API를 지원한다. API 접근을 하려면 Database 및 API 키가 필요하다. 키를 얻는 방법에 대해서는 Build your first integration을 참조한다. Notion의 API Reference는 NOTION API - Introduction을 참조한다. 여기서는 database에 대한 page 작업을 다룬다. Create a page Retrieve a page Update page properties Archive a page 2. Database to perform Page query 방법에 앞서, 테스트를 수행할 DB의 형태는 아래와 같다. DB 작업 수행 간 JSON 형식의 Page objec..

C#/Common

C# - Notion API - Query, Filter database

1. Introduction Notion은 페이지, 데이터베이스 등에 대해 REST API를 지원한다. API 접근을 하려면 Database 및 API 키가 필요하다. 키를 얻는 방법에 대해서는 Build your first integration을 참조한다. Notion의 API Reference는 NOTION API - Introduction을 참조한다. 여기서는 다음 항목을 다룬다. Query a database Paginated query Filter database entries 2. Database to perform DB 조회 및 필터 방법에 앞서, 테스트를 수행할 DB의 형태는 아래와 같다. 선택으로 명명되어 있는 select 항목의 옵션은 아래와 같다. DB 작업 수행 간 JSON 형식의 ..

C#/Common

C# - Notion API - Retrieve, Update database

1. Introduction Notion은 페이지, 데이터베이스 등에 대해 REST API를 지원한다. API 접근을 하려면 Database 및 API 키가 필요하다. 키를 얻는 방법에 대해서는 Build your first integration을 참조한다. Notion의 API Reference는 NOTION API - Introduction을 참조한다. 여기서는 다음 항목을 다룬다. Retrieve a database Update a database 2. Database to perform 조회 및 업데이트 방법에 앞서, 테스트를 수행할 DB의 형태는 아래와 같다. 선택으로 명명되어 있는 select 항목의 옵션은 아래와 같다. DB 작업 수행 간 JSON 형식의 Database object를 HTT..

C#/Language

C# - Language - stackalloc expression

Introduction stackalloc 식은 스택에 메모리 블록을 할당한다. 할당된 메모리 블록은 메서드가 반환될 때 자동으로 해제되며 명시적으로 해제가 불가능하다. 할당된 메모리 블록은 GC의 대상이 아니며 fixed 문을 사용하여 피닝하지 않아도 된다. Example stackalloc 식은 다음 형식 중 하나에 할당할 수 있다. System.Span : T는 비관리형 형식 static void Main(string[] args) { Span foo = stackalloc int[3] { 1, 2, 3 }; Span bar = stackalloc int[] { 1, 2, 3 }; Console.WriteLine(foo[1]); Console.WriteLine(bar[1]); } /* output:..

C#/Language

C# - Language - Pointer related operators (&, *, ->, [], ...)

Introduction C#에서는 포인터를 제한된 범위에서 지원한다. 포인터는 메모리 주소를 보유 하기만 한다. 비관리형 형식만 참조 가능하다. 포인터로 지정 가능한 대상은 GC의 영향을 받지 않도록 고정되어야 한다. (스택에 존재하거나 fixed 문으로 고정되어야 함) 포인터를 사용하기 위해서는 unsafe 컨텍스트가 필요하다. 포인터 연산자의 종류와 역할은 아래와 같다. & : 메모리 주소 반환 * : 포인터 역참조 -> : 멤버 액세스 [] : 요소 액세스 & 연산자 & 연산자는 피연산자의 주소를 반환한다. unsafe static void Main(string[] args) { int foo = 6; int* bar = &foo; Console.WriteLine($"{(long)bar:X2}");..

C#/Language

C# - Language - Unmanaged types

Introduction 다음 형식은 비관리형 형식이다. 정수 부동 소수점 논리 열거형 구조체 : 비관리 형식의 필드만 보유하는 경우 포인터 구조체 구조체의 경우 형태에 따라 관리형, 비관리형이 될 수 있다. 다음 구조체는 관리형이다. public struct Foo { public int Bar; public string Baz; } 관리형 형식인지 파악하기 위해 CompilerServices의 RuntimeHelpers를 이용할 수 있다. using System.Runtime.CompilerServices; static void Main(string[] args) { Console.WriteLine(RuntimeHelpers.IsReferenceOrContainsReferences()); } /* ou..

C#/Language

C# - Language - Operator overloading

Introduction 사용자 정의 형식은 C# 연산자를 오버로드 할 수 있다. operator 키워드와 함께 연산자를 정의할 수 있으며, 아래의 규칙을 지켜야한다. public static으로 선언한다. 매개 변수의 경우 다음 규칙을 따른다. 단항 연산자 : 1개 이항 연산자 : 2개 하나 이상의 매개 변수의 형식이 사용자 정의 형식 T 또는 T?이어야 한다. Example 다음은 연산자 오버로드의 간단한 예시를 보여준다. public struct Int { private readonly int _int; public Int(int value) => _int = value; public override string ToString() => _int.ToString(); public static Int ..

C#/Language

C# - Language - User-defined conversion operators (implicit, explicit)

Introduction 사용자 정의 형식은 다른 형식으로 암시적 또는 명시적 변환을 정의할 수 있다. 암시적 변환은 예외를 발생시키지 않고 항상 성공해야한다. 명시적 변환은 예외를 발생하거나 정보 손실의 가능성이 있는 경우 정의한다. checked 키워드를 이용해 System.OverflowException을 발생시킬 수 있는 변환을 정의할 수 있다. (C# 11) checked 변환을 정의하는 경우 checked를 사용하지 않는 변환 또한 정의해야 하며, 변환은 각각의 컨텍스트를 통해 수행된다. 사용자 정의 변환은 is 및 as 연산자를 사용하는 경우 고려되지 않는다. (캐스트 식 이용) 사용자 정의 변환은 operator 키워드와 함께 다음 키워드를 사용한다. 암시적 변환 : implicit 명시적 ..

C#/Language

C# - Language - typeof operator

Introduction typeof 연산자는 지정된 형식의 System.Type 인스턴스를 반환한다. typeof의 인수는 형식 또는 형식 매개 변수의 이름으로, 제네릭 형식 또한 사용 가능하다. typeof에는 다음 형식을 사용할 수 없다. dynamic Nullable 참조 형식 Example 다음은 typeof를 통해 System.Type 인스턴스를 얻는 예시다. Console.WriteLine(typeof(int)); Console.WriteLine(typeof(string)); Console.WriteLine(typeof(Dictionary)); Console.WriteLine(typeof(Dictionary)); /* output: System.Int32 System.String System...

C#/Language

C# - Language - Cast expression

Introduction 캐스트 식은 (T)expression으로 나타내며, 명시적으로 expression을 T로 형식 변환한다. 명시적 변환이 불가한 경우 컴파일 타임 오류가 발생한다. 런타임에 명시적 변환에 실패하는 경우 System.InvalidCastException, System.OverflowException 등이 발생할 수 있다. Example 다음은 캐스트 식을 사용하는 사례를 보여준다. long foo = 123; Console.WriteLine((ushort)foo); List bar = [1, 2, 3]; IEnumerable baz = (IEnumerable)bar; Console.WriteLine(string.Join(", ", baz)); /* output: 123 1, 2, 3 ..

Peponi_
Peponi