C#에서의 reference를 알아보기 위해 약간의 테스트를 하였다.
C#에서도 Java에서와 마찬가지로 모든 값들을 reference로 유지 하고 있었다.
의문점은 과연 이 reference가 언제까지 유지가 되며 언제 바뀌는지가 궁금하여 테스트를 해보았다.
결과는 다음과 같았다.
Class C1 { public Test test = new Test(); }
Class C2 { public Test test = new Test(); }
Class Test { public string str = "Test"; }
C1 c1 = new C1(); C2 c2 = new C2();
c2.test = c1.test;
c1과 c2가 생성이 되면 안에 있는 test가 생성이 되면서 test는 각각의 Test instance를 reference로 만든다.
그리고 c2.test = c1.test가 되는 순간에 c2의 test는 기존에 가지고 있던 Test instance를 버리고 c1이 reference하고 있는 Test instance로 reference를 옮긴다.
그래서 이 시점에 c1.test와 c2.test가 같은 Test instance를 reference하고 있는 것이다.
하지만 이것이
Test newTest = new Test(); c1.test = newTest;
를 하게 되면 c1과 c2가 함께 reference하고 있던 Test instance를 c1 --> newTest
c2 --> 예전 Test instance
를 reference 하게 된다.
하지만, c1.test = newTest를 하기전에 c1.test.str = "New Test";
를 하게 되면 이것은 c1.test가 가리키고 있는 Test instance를 직접 호출 하여 값을 바꾸는 것이 되기 때문에
c1.test와 c2.test가 함께 바뀌는 결과를 낳게 되는 것이다.
이 사실은 basic data type에도 같이 적용이 된다.
예를 들어 c1.int = 3;
은 c1.int를 직접 호출하여 값을 바꾸는 것이지만, int x = 4; c1.int = x;
를 하게 되면 c1.int의 reference 값을 바꾸에 되어 c1.int와 c2.int의 값이 달라지게 된다.
위 사실만 주지 하고 있으면, C#에서의 reference는 마스터를 할 수 있다고 볼 수 있다.
VS.Net 2005로 웹 서비스를 배포를 하려고 하는데, 2003에서와는 다르게 웹 사이트가 컴파일이 안되고 배포 프로젝트에 소스가 추가가 된다. ㅡㅡ;;
해서 MS에 직접 문의를 해보았다. 답변은, 웹 프로젝트를 먼저 Publish를 하고 배포 프로젝트에 Publish 된 경로를 직접 추가 하거나, 솔루션에 Publish 된 경로의 프로젝트를 추가를 하고, 배포 프로젝트에서 그 프로젝트를 추가하면 된다고 한다. MS 말로는 Java쪽이나 다른 것들도 이런 방식으로 하고 있다고 하는데 좀 불편해진건 사실이다.
C#으로 프로그램을 짤때 프로세스를 잡아먹는 polling대신에 event를 쓰면 간단히 callback function을 호출 할 수 있습니다. 하지만 그 속도가 의심되는 바 간단한 실험을 했습니다. 그랬더니 생각보다 상당히 빠른 속도로 이벤트가 발생 하는 것을 발견 했습니다. DateTime 클라스의 Ticks를 써서 찍어 봤더니 아래와 같은 속도가 나왔습니다. 그래서 Ticks를 MSDN에서 찾아보니...
The value of this property represents the number of 100-nanosecond intervals that have elapsed since 12:00:00 midnight, January 1, 0001.
100 nanosecond 단위로 숫자가 올라 간다네여.. 더 많은 event를 동시에 발생 시켜서 좀더 정확히 알아 볼 수 도 있었으나, 귀차니즘과 프로젝트 시간의 압박으로 포기... 어쨌든,