= #!wiki
= \cat CsReference
=
= 참여자: uskusi
=
* =! C# Coding
+
+ TOC
=
= 틈나는 대로 C#다운 코딩은 무엇인가에 대해서 정리합니다. Tip&Tech 의 성격을 지닌 페이지입니다.
= 머리를 식힐겸 한번씩 보면서 아는것을 정리해나가도록 합니다.
=
* = Performance
=
= 1. 문자열비교는 쓸데 없는 작업을 많이 하게 된다. 만약 문자열이 비어있는지 검사하는 경우에는 length property 를 쓰는것이 좋다.
=
= --bcode--
= // not recommended
= if (str != "")
= // 이것이 C나 PHP에서 쓰던 전통적인 방식이다. C# 에서는 이 방법대신 length method를 사용할 것을 권유한다.
=
= // recommended
= if (str.length > 0)
= --ecode--
=
=
= ___
= 2. 1번과 연계되는 내용으로서 문자열이 일치하는지 확인할때 Equals 메서드를 사용한다.
= --bcode--
= String str1 = "str1";
= String str2 = "str2";
=
= // not recommended
= if (str1 == str2) { code }
= // 이것이 C나 PHP에서 쓰던 전통적인 방식이다. C# 에서는 이 방법대신 Equals Method를 사용할 것을 권유한다.
=
= // recommended
= if (str1.Equals(str2)) { code }
= --ecode--
=
= ___
= 3. C#의 문자열은 원칙적으로 변경 불가능하다. 변경명령을 받을때는 Heap 내의 새로운 영역에 메모리를 확보하고 변경, 할당후에 해당 변수의 해시코드를 변경하는 작업이 이루어진다. 만약 문자열을 변경하려고 한다면,
=
= - 프로그래머 입장에서 볼때는 쓸데없는 메모리를 사용하게 된다.
= - 원래 문자열이 있던 메모리는 다시 (자동으로)반환되어야 하므로 GC 가 하는일이 많아진다.
= - 당연히 부하가 많아지고 느려진다.
= -
=
= 따라서 StringBuilder를 사용하는 편이 낫다.(고는 하지만 몇가지 논란이 있다. 마지막에 다루기로 한다.)
=
= --bcode--
= // not recommended
= String str;
= str = "This is a string.";
= str = str + " This is an appended string."; // 또는 str += " This is an appended string.";
= --ecode--
=
= 이것이 C나 PHP에서 쓰던 전통적인 방식이다.
=
= --bcode--
= // recommended
= StringBuilder str = new StringBuilder("This is a string.");
= str.Append(" This is an appended string.");
= --ecode--
=
= 일반적인 경우에 아래 소스에서 Overhead가 덜 걸린다.
=
= StringBuilder는 버퍼를 미리 잡아놓고 시작하기 때문에 문자열 연결과 같은 작업이 일어날 때 빈공간에 바로 투입할 수 있고, 메모리를 새로 Allocate하고 복사하는등의 불필요한 작업을 하지 않는다.
=
= StringBuilder 클래스를 살펴보면 int capacity 를 매개변수로 받는 오버라이딩 메서드가 있는데 이것이 버퍼의 크기를 잡아주는 역할을 한다. 버퍼의 크기를 너무 적게 잡으면 string 이 하는짓을 그대로 반복할 것이고, 버퍼의 크기를 너무 크게 잡으면 메모리의 낭비를 초래한다. 적절히 capacity 값을 조절해 주면서 쓰는것이 옳다.
=
=
= = 토론
=
= C#에서 권장하는 표준코딩을 설명하는 챕터이니만큼 자주 보게 될 것입니다. 권장하는 각 코드에 대한 출처를 알 수 있으면 좋겠습니다. 예를 들어 Equals() 메서드 사용의 경우 속도면에서 이것을 권장하는 것인지 아니면 다른 무슨 이유가 있는 것인지 궁금한데 원출처를 알면 더 자세한 이유를 알 수 있겠지요. -- HuidaeCho