C#/Language

C#/Language

C# - Language - Declaration statements (선언문)

1. Introduction선언문은 지역 변수, 상수 또는 참조 변수를 선언한다. // local variable string foo = string.Empty; // local constant const int bar = 0; // local ref variable ref string baz = ref foo;선언문은 한번에 여러 변수를 선언할 수도 있다. int foo, bar, baz;선언문은 block, switch block에서는 허용되지만 embedded statement에는 허용되지 않는다. { int foo; // allowed } if(true) bool bar; // CS10232. Local variable지역 변수 선언은 다음과 같이 한다..

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 ..

C#/Language

C# - Language - as operator

Introduction as 연산자는 식의 결과를 지정된 형식 (참조 또는 nullable 값 형식) 으로 변환한다. 변환할 수 없는 경우 null을 반환하며, 예외를 출력하지 않는다. as 식은 아래와 같이 표현한다. expression as type expression은 값을 반환하는 식, type은 형식 또는 형식 매개 변수의 이름이다. 위 식은 아래 식의 축약형이다. expression is type ? (type)(expression) : (type)null as 식은 아래 항목 중 하나를 만족하면 변환된 객체를 반환한다. T의 파생 형식 T 인터페이스 구현 T 형식으로 boxing 또는 unboxing 가능한 경우 as 연산자는 숫자 변환에 대해서는 고려하지 않으며 사용자 정의 변환을 수행할 ..

C#/Language

C# - Language - is operator

Introduction is 연산자는 주어진 식의 결과를 이용하여 다음 작업을 수행한다. 형식 일치 여부 확인 패턴 일치 여부 확인 is 식은 아래와 같이 표현한다. expression is type // 1 expression is pattern // 2 expression은 값을 반환하는 식, type은 형식 또는 형식 매개 변수의 이름이다. 여기서 type은 무명 메서드 또는 람다 식으로 표현할 수 없다. expression은 값을 반환하는 식, pattern은 일치 여부를 확인할 패턴이다. 형식 일치 여부 확인 is 연산자를 이용하여 형식 일치 여부를 확인할 수 있다. 주어진 식이 null이 아닌 경우, is 연산자는 다음 조건 중 하나를 만족하면 true를 반환한다. T or T? (HasVal..

C#/Language

C# - Language - List patterns

Introduction 다음 C# 식과 문은 패턴을 지원한다. is 식 switch 식 switch 문 여기서는 C# 11부터 지원되는 목록 패턴에 대해 설명한다. Example 목록 패턴은 배열, 컬렉션에 대해 특정 시퀀스와 매칭하는 기능을 제공한다. List ints = [-1, 2, 3]; // 기본 사용 Console.WriteLine(ints switch { [-1, 2, 3] => true, _ => false }); /* output: True */ // 패턴 중첩 Console.WriteLine(ints switch { [ mid, _ => false }); /* output: 2 */ 목록 패턴은 범위 연산자 (..)를 통한 부분 매칭을 지원한다..

C#/Language

C# - Language - Discard, var pattern

Introduction 다음 C# 식과 문은 패턴을 지원한다. is 식 switch 식 switch 문 여기서는 다음 패턴을 설명한다. 무시 (_) 패턴 : null을 포함한 모든 식을 매칭한다. var 패턴 : null을 포함한 모든 식을 매칭하고 지역 변수에 할당한다. _ 패턴 _ 패턴은 switch 식에만 사용이 가능하고, switch 문의 default와 같은 기능을 한다. switch 식에서 _을 사용하지 않고 모든 경우를 커버하지 못하면 컴파일러는 경고를 생성한다. (CS8509) int? foo = null; Console.WriteLine(foo switch { 1 => 1, 2 => 2, _ => "Not recognized" }); /* output: Not recognized */ v..

Peponi_
'C#/Language' 카테고리의 글 목록