1.ref local, return, struct
1-1.ref local
이제 ref 키워드를 이용해서 참조형식으로 값 형식을 선언할 수 있게 됐다. 변수를 복사하는 대신 메모리 주소값을 반환하니 성능적으로 향상이 있을 듯 하다.
void Main()
{
int x = 10;
ref int refLocal = ref x;
Method(ref refLocal);
}
1-2.ref return
이제 ref 키워드를 이용해서 참조형식으로 값 형식을 반환할 수 있게 됐다. 아래 예제를 보자
ref int Find(int[] array, int value)
{
for (int i = 0; i < array.Length; i++)
{
if (array[i] == value)
{
return ref array[i];
}
}
throw new ArgumentException("Value not found in array");
}
아래 예제는 array안에서 value값을 찾아서 return한다. 기존의 메서드였다면 ? 값 형식을 반환하기에 배열안에 있는 값이 아닌 새로 생성된 값을 리턴할 것이다. 하지만 7.0부터는 ret형식 반환값을 제공하기 때문에 매개변수로 넣은 배열안에 있는 값을 반환할 수 있다.
1-3.ref struct
이제 구조체를 참조 형식으로 선언할 수 있다
ref struct Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y)
{
X = x;
Y = y;
}
}
void Main()
{
Point point = new Point(10, 20);
ref Point refPoint = ref point;
}
2.throw expression
기존에는 throw 문(statement) 이었기 때문에, 람다식이나 Expression-bodied 함수에서 사용하는 표현식(expression) 안에서는 사용할 수 없었다. C# 7.0 에서는 throw 를 표현식 안에서도 사용할 수 있게 되었다.!
// C# 7 이전 throw 문
if (str == null)
{
throw new Exception();
}
this.name = str;
//새로운 형식!
this.name = str ?? throw new Exception();
3.Expression-bodied
=>형식을 더 많은 곳에서 사용할 수 있다.(Ex.생성자(Constructor), Finalizer (Destructor), 속성이나 인덱서의 accessor (getter/setter) 등등..
4.ValueTask
Task 또는 Task<T>를 사용하는 것이 일반적이지만, 때로는 다른 타입을 반환해야 할 경우가 있다 이를 위해 C# 7에서는 커스텀 비동기 반환 타입(custom async return type)을 지원한다.
커스텀 비동기 반환 타입은 ValueTask 또는 ValueTask<T>으로 정의된다. Task 또는 Task<T>와 비슷하게 동작하지만, 값 형식(struct)으로 구현되어 있다. (객체 할당을 피하고 GC(Garbage Collector)의 부담을 줄일 수 있다는 것)
public async ValueTask<int> GetResultAsync() <- int형식의 valueTask를 반환할 수 있다!
{
// 비동기 작업 수행
await Task.Delay(1000);
// 결과 반환
return 42;
}
'프로그래밍 언어 > c#' 카테고리의 다른 글
c# 8.0 정리 (0) | 2023.05.14 |
---|---|
C# Var에 관해서 (0) | 2023.05.01 |
c#7.0 Tuple, Local Function, out, binary literal, Deconstructor (0) | 2023.04.29 |
C# 7.0 패턴 매칭 (2) | 2023.04.29 |
c# yield, nullable, 전처리기, 인덱서, Anonymous, Extension,partial, dynamic (0) | 2023.04.28 |