본문 바로가기

span

C# ReadOnlyMemory<T>와 메모리 안전성 확보 ReadOnlyMemory는 데이터를 복사하지 않고 읽기 전용 뷰를 제공해 성능과 메모리 안전성을 동시에 확보하는데 유용합니다. 특히 비동기 경계도 안전하게 넘길 수 있어 API 설계에서 ReadOnlySpan보다 실용적입니다.1. ReadOnlyMemory 한눈에 보기ReadOnlyMemory는 힙에 저장 가능하며 필드로 보관, 비동기 메서드 반환 등이 가능합니다. 반면 ReadOnlySpan는 ref struct로 스택 한정이며 필드 저장이나 async 경계를 넘길 수 없습니다. ReadOnlyMemory는 Slice로 부분 뷰를 만들고, 읽을 때는 .Span으로 ReadOnlySpan을 얻어 빠르게 접근합니다.2. 기본 사용법과 복사 없는 슬라이싱배열과 문자열에서 쉽게 읽기 전용 뷰를 만들고 복사 .. 더보기
C# 구조체(Struct) 심층 분석 구조체는 C#의 대표적인 값 형식입니다. 값语의 복사语, 힙/스택 오해, 불변 설계, boxing, ref struct, 생성자 규칙까지 실무에서 꼭 알아야 할 포인트를 정리합니다.1. 값 형식의 본질구조체는 값 형식입니다. 변수에 대입하거나 메서드 인자로 전달하면 값이 통째로 복사됩니다. 참조가 아닌 데이터 자체가 이동한다는 점이 핵심입니다.struct Point{ public int X; public int Y; public Point(int x, int y) { X = x; Y = y; } public void Move(int dx, int dy) { X += dx; Y += dy; }}static void MoveRight(Point p){ // 값 복사본을 수정합니다... 더보기
C# 컬렉션 초기화와 Index/Range 컬렉션 초기화 구문과 Index/Range 연산자는 컬렉션을 간결하게 만들고, 슬라이싱을 쉽게 해줍니다. 실전에서 바로 쓸 수 있는 문법과 주의점을 정리합니다.1. 컬렉션 초기화 기본컬렉션 초기화는 내부적으로 Add 호출을 나열하는 문법 설탕입니다. 가독성과 선언적 스타일에 유리합니다.var numbers = new List { 1, 2, 3, 4 };var dict = new Dictionary{ { "Kim", 30 }, // Add("Kim", 30) { "Lee", 28 }};// C# 6+ 인덱서 초기화: 존재하면 갱신, 없으면 추가var ages = new Dictionary{ ["Kim"] = 30, ["Lee"] = 28, ["Lee"] = 29 // Lee .. 더보기
C# Span<T>과 Memory<T> 1. 개념 설명Span는 연속된 메모리를 가리키는 stack-only 타입으로, 배열·문자열 등의 일부를 할당 없이 슬라이스할 수 있습니다. Memory는 같은 메모리를 heap에서 안전하게 보관할 수 있어 필드·비동기 경계에서도 사용할 수 있습니다. 필요 시 Memory.Span으로 실제 접근을 수행하고, ReadOnlySpan로 문자열 처리 비용을 줄일 수 있습니다.2. 코드 예제아래 예제는 배열을 슬라이스해 값을 수정하고, Memory로 부분 합을 계산하며, 문자열에서 ReadOnlySpan로 부분을 추출합니다. Console.WriteLine으로 결과를 확인합니다.using System;class Program{ static int Sum(Memory data) { var .. 더보기