c#
Generic, where, using static
by kcj3054
2022. 12. 6.
Generic... where..
- c#의 generic을 사용할 때 제약없이 받아보는 경우를 먼저보자
T AllocateIfNull<T>(T item)
{
if (item == null)
{
item = new();
}
return item;
}
- 이렇게 된 경우에는 T에 무조건 기본생성자가 있을거라는 확신이 차있는 경우다 그렇지만 기본생성자가 없는 경우라면 에러가 발생할 수 있다 항샹을 시킨다면 ..
T AllocateIfNull<T>(T item) where T : class, new()
{
if (item == null)
{
item = new();
}
return item;
}
- where을 이용해서 T조건을 걸어준다, class이면서 new() 기본생성자를 가지고있는 것이다.
- cf: Nullable는 -> ?로 축약형으로 가능하다
Generic 타입 사용시 호출쪽에서 ...
//T생략가능..
Utility.WriteLog<bool>(true);
Utility.WriteLog(0x05);
Utility.WriteLog(3.14159f);
public static class Utility
{
public static void WriteLog<T>(T item)
{
string output = string.Format("{0}: {1}", DateTime.Now, item);
Console.WriteLine(output);
}
}
- c# 컴파일러가 writeLog 메서드의 인자로 T타입이 전달된다는 사실을 알리고 자동으로 유츄해서 처리해서 생략가능.
using static
StaticOnly.WriteNameAsync();
WriteNameAsync();
public static class StaticOnly
{
public static string _name;
public static void WriteNameAsync()
{
ThreadPool.QueueUserWorkItem(
delegate(object objState)
{
Console.WriteLine(_name);
}
);
}
}
- 원래의 예로면 StaticOnly.WriteNameAsync()을 해야한다 하지만 using static StaticOnly를 한다면.. 바로 WriteNameAsync()을 사용할 수 있다
cf...
delegate int? MyDivide(int a, int b);
MyDivide myFunc = delegate(int a, int b)
{
if (b == 0)
return null;
return a / b;
};
- 익명 타입의 메서드를 델리게이트변수에 담앙서 사용할 수 있다