연산자

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 - 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 - 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 - Index, Range operators (^, ..)

Introduction 인덱스 (^), 범위 (..) 연산자는 Count, Length와 같은 int getter 프로퍼티를 가진 형식에 사용할 수 있다. 컬렉션 식 또한 여기에 포함된다. ^ 연산자는 요소 위치를 거꾸로 표현한다. ^n으로 위치를 지정한다. n의 자리에 시퀀스 길이를 넣는 경우 첫번째 요소, ^1은 마지막 요소이다. .. 연산자는 요소의 범위를 나타낸다. 표현식은 a..b이며 [a, b)를 의미한다. ^ 연산자와 같이 사용할 수 있다. 아래는 ^, .. 연산자의 사용법을 보여준다. ^ 연산자 string foo = "Hello, World!"; Console.WriteLine(foo[^2]); // d int[] bar = [1, 2, 3, 4, 5]; Console.WriteLine(..

C#/Language

C# - Language - Null-conditional operators (?., ?[])

Introduction Null 조건부 연산자 (?., ?[]) 는 멤버 액세스 ., 인덱서 액세스 [] 시 피연산자가 null이 아닐 때만 연산을 수행하며 null인 경우에는 null을 반환한다. Example Null 조건부 연산자는 단락 연산자로 피연산자가 null인 경우 . 및 [] 연산이 실행되지 않고 null을 반환한다. string? foo = null; if (foo?.Length is null) Console.WriteLine("Null-conditional member access returns null"); if (foo?[1] is null) Console.WriteLine("Null-conditional indexer access returns null"); /* output: N..

C#/Language

C# - Language - Subtraction operators (-, -=)

Introduction -, -= 연산자는 정수, 부동 소수점, 대리자 형식을 지원한다. 여기서는 -, -= 연산자에 대해 간단히 알아본다. 산술 연산자 -에 대한 자세한 내용은 +, - operator (Arithmetic operator)를 참조한다. 대리자 제거 동일한 대리자 형식에 대해 - 연산자는 제거를 지원하며, 다음 규칙에 따라 인스턴스를 반환한다. 오른쪽 피연산자가 왼쪽 피연산자의 호출 목록에 포함되어 있는 경우, 왼쪽 피연산자의 오른쪽에서부터 제거 후 반환 Action a = delegate { Console.Write(nameof(a)); }; Action b = delegate { Console.Write(nameof(b)); }; var foo = a + b + a + b; var ..

C#/Language

C# - Language - Addition operators (+, +=)

Introduction +, += 연산자는 정수, 부동 소수점, 문자열, 대리자 형식을 지원한다. 여기서는 +, += 연산자에 대해 간단히 알아본다. 산술 연산자 +에 대한 자세한 내용은 +, - operator (Arithmetic operator)를 참조한다. 문자열 연결 피연산자 중 하나 또는 둘 다가 문자열 형식인 경우 + 연산자는 피연산자를 연결한다. Console.WriteLine("Hello " + "World!"); Console.WriteLine("Score : " + 5); Console.WriteLine("Null's string representation is string.Empty - " + null); /* output: Hello World! Score : 5 Null&..

C#/Language

C# - Language - Lambda operator (=>)

Introduction 람다 기호 (=>) 는 두 가지 기능을 한다. 람다 연산자 : 람다 식에서 =>는 입력 매개변수와 본문을 구분한다. 식 본문 정의 : 식 본문 정의에서 =>는 멤버 이름과 구현을 구분한다. 람다 연산자 다음은 람다 식을 정의하는 방법을 보여준다. Action foo = () => Console.WriteLine("Hello, World!"); Func bar = () => "Hello, World!"; 형식 추론이 가능한 경우, 람다 식의 매개 변수에 대한 형식 선언을 생략할 수 있다. Func foo = message => $"Hello {message}"; // 매개 변수가 하나인 경우 괄호 () 생략 가능 Func bar = (messageA, messageB) => $"{m..

C#/Language

C# - Language - Delegate operator

Introduction delegate 연산자는 대리자 형식으로 변환할 수 있는 무명 메서드를 만든다. System.Action, System.Func 형식과 같은 형식으로 변환 가능하다. Example 다음은 무명 메서드를 만드는 방법이다. Action foo = delegate { Console.WriteLine("foo"); }; Action bar = delegate (int a) { Console.WriteLine(a); }; // 사용되지 않는 매개변수에 무시 ( '_' ) 지정 가능 Action baz = delegate (int _, int a) { Console.WriteLine(a); }; 무명 메서드는 람다 식과 달리 매개 변수를 생략할 수 있다. 무명 메서드의 대부분이..

Peponi_
'연산자' 태그의 글 목록