1. C#에서의 모든 변수, 데이터는 객체이며, 이들은 전부 "object"라는 최상위 클래스에서 파생된 것들이다.
2. nullable이란, 아무것도 들어있지 않은 object를 의미한다.
3. var은 컴파일러에 의해 자동으로 형을 할당받는 것을 의미한다.
var i = 10;
4. object 클래스의 .Parse() 메소드는 문자열을 데이터로 변화시켜준다.
int x;
x.Parse("142"); -> 142가 x에 저장됨
비슷한 걸로 .ToString()이 있음.
5. C#에서 다중 배열을 만드는 방법은 두 가지가 있는데, 이 둘은 사실 다르다.
하나는 int[][] x = new int[3][]; 이고
또 하나는 int[ , ] x = new int[3,3]; 이다.
차이점은 전자는 가변배열(즉 각 행의 길이가 다를 수 있다)이지만,
후자는 정해진 격자만큼만이 배정된다는 점이다. (3x3)
6. System.Array에서 참고해야할 메소드
GetLength()
IndexOf() -> 인덱스값 찾아오기
7. C#에서도 C++의 &처럼 변수를 레퍼런스로 넘길 수 있다.
func(ref int a) 처럼 작성하면 된디. (C++에서의 func(int& a)와 유사)
ref와 유사하게 out이란 것도 있다
8. 함수에 아규먼트가 몇 개가 전달될지 확실하지 않을 경우
static int sumAll(params int[] args)
같은 형식으로 매개변수를 설정하면, 입력한 모든 매개변수들이 배열로 전달된다.
9. static이 왜 필요한가?
C#의 Math 클래스는 변수 없이 내부에 계산을 도와주는 메소드만을 가지고 있는데, 이럴 경우 static을 사용하는 게 더 간편하다.
주의해야 할 점은, C#에서 static(정적) 메소드는 인스턴스에서 호출이 불가능하다.
10.
11.
스레드와 다르게 Task는 알아서 끝난다.
즉 위에 나온 Shoot and Forget에 적합한 방식이다.
Task<int>는 Task가 int형 반환을 한다는 것을 의미한다. 정확히는 Task가 실행할 메소드(매개변수로 받는 메소드)
가 int형을 반환한다는 의미이다.
그냥 Task라고만 선언하면 자동으로 반환형이 void가 된다.
12.
Parallel이란 Task 객체를 여러개 만들어낼 때 사용한다.
위 밑줄친 부분의 뜻은
0에서 100까지의 매개변수를 전달하며 ActionMethod를 가지는 Task를 생성한다는 뜻이다.
주의할 점은 0,1,2, ... 순으로 순차적으로 Task가 생성되는게 아니라는 점이다.
그 순서는 스스로 최적화해 결정하므로 거의 랜덤하다.
13.
Task를 굳이 사용하지 않아도 메소드 이름 앞에 async 태그를 붙이는 것으로 자동으로 메소드가 비동기적으로 실행되게 만들 수 있다.
즉 Task(TestMethod) 가 실행되는 것과,
public static async Task TestMethod를 TestMethod()로 실행하는 것이 같다.
여기서 async가 붙은 메소드 내에는 await라는 키워드가 사용되는데,
내부에서 Task를 생성하고 해당 Task가 생성될 때까지 기다린다.
그리고 다시 제어권을 main(혹은 해당 메소드를 호출한 함수)로 돌려보낸다.
그러고 자신은 Task를 실행하며 Task의 처리가 끝나면 await 문장 뒤로 계속 진행한다. (위 사진에서 문장4번에 해당)
즉 최종적으로는 문장3과 문장4가 동시에 실행되는 것이다.
주의할 점은 async함수 내에서 await 키워드를 쓸면 반드시 Task클래스를 어떤 방식으로든 함수 내에서 사용해야 한다.
Task객체를 새로 만들어도 되고, Task.Delay()같은 걸 써도 되지만 어쨌든 써야한다.
14.
이러한 async함수를 Read, Write에 적용한 메소드가 .NET Framework에 이미 마련되어있다.
ReaAsync와 WriteAsync는 크기가 큰 파일을 읽거나 쓸 때 사용하면 좋다.
즉 파일을 읽어오거나 쓰는 동안 다른 작업을 처리할 수 있다.
실제 사용 예제이다.
buffer을 선언하는 이유는 읽어올 만큼의 메모리를 미리 확보해두는 용도이다.
while문 내의 !=0 은 더이상 읽을 내용이 없거나 버퍼만큼 다 읽었을 때 0을 반환하기 때문에 추가한 코드이다.
이렇게 만든 CopyAsync메소드를 WinForm 버튼 클릭에 연결시키면 다음과 같다.
15.
16.
Hooking은 eventhandler와는 다른 개념으로, 자기(프로그램)에게 들어오는 인풋이 아니더라도 어떤 입력이 들어오면 이를 낚아채는 것을 의미한다.
17.
'lang > .NET' 카테고리의 다른 글
SynchronizationContext (0) | 2024.01.01 |
---|---|
Akka.NET (0) | 2023.12.19 |
Delegate (0) | 2021.05.30 |
Winform 메모 (0) | 2021.05.17 |