728x90
C#에서도 C++에서 처럼 인라인 함수를 사용하는 것이 가능하다. 사실 인라인 함수는 #define 매크로 함수 처럼 코드상에서 함수로 분리되는 것처럼 보이지만 컴파일 시에 이 코드에 이 함수의 내용이 대체되는 효과가 있는 것으로 알고 있다.
C#에서는 이것을 anonymouse method 즉, 무명 메소드라고 한다.
그렇다면 위의 무명 메소드가 Cpp에서 처럼 그런 인라인 함수처럼 행세 하는 지는 알아볼 일이다.
예제는 ini 파일을 읽고 쓰는 클래스안에서 인라인 함수를 사용하는 것으로 한다.
class AAA
{
//이 함수의 Wrapper 함수를 delegate 선언
private delegate void IniVal(String Section, String Key, Boolean bCheckDef, ref String value);
//우선 ini 파일을 읽고 쓸수 있는 네이티브 함수 라이브러리와 함수의 프로토타입을 다음과 같이 선언한다.
[DllImport("kernel32.dll")]
//ini 파일 읽기
private static extern int GetPrivateProfileString(String section, String key, String def, StringBuilder retVal, int size, String filepath);
[DllImport("kernel32.dll")]
//ini 파일 쓰기
private static extern int WritePrivateProfileString(String section, String key, String val, String filepath);
//이 함수의 Wrapper 함수을 anonymous method로 초기화 한다.
IniVal GetIniValue = delegate(String Section, String Key, Boolean bCheckDef, ref String value)
{
StringBuilder sbTemp = new StringBuilder(1000);
try
{
if (bCheckDef)
{
if (0 == GetPrivateProfileString(Section, Key, "", sbTemp, 1000, m_sIniPathDefault))
{
value = null;
}
}
else
{
if (0 == GetPrivateProfileString(Section, Key, "", sbTemp, 1000, m_sIniPath))
{
value = null;
}
}
value = sbTemp.ToString();
}
finally
{
sbTemp = null;
}
};
}//end of class AAA
그리고 참고 사이트 예제에서 처럼 메서드를 바꾸어 줄수도 있다.
p = new Printer(TestClass.DoWork);
static void DoWork(string k)
{
System.Console.WriteLine(k);
}
※ 프로파일러로 확인 해 본 결과 무명 메소드도 C++에서 inline 함수처럼 컴파일 시에 해당 소스 코드가 합쳐지는 것으로 보인다. 무명 메소드로 만들기 전과 만든 후의 비교에서, 해당 메소드에 대한 hit 카운트가 없어 졌음)
자연스레 위의 함수 사용은 다음과 같이 될 것이다.
private String GetInfo(String Section, String Value, Boolean bCheckDef)
{
String tmp = null;
GetIniValue(Section, Value, bCheckDef, ref tmp);
return tmp;
}
728x90
'프로그래밍' 카테고리의 다른 글
초보자를 위한 Blurring 기술 - 가우시안 Blur (0) | 2023.04.07 |
---|---|
초보자를 위한 이미지 Blurring 기술 - 2 (0) | 2023.04.06 |
[자바] 부울 값을 정수 값으로 변환하기 (0) | 2023.04.03 |
[MinGW ] 윈도우용 SQLCipher C에서 자바까지 - 2 (0) | 2023.03.31 |
[MinGW ] 윈도우용 SQLCipher C에서 자바까지 (0) | 2023.03.30 |