// 실행파일 한번만 실행시키는 방법: mutex 사용

 

static void Main()

{

bool checkOther = false;

try

{

m_OneProcess = new System.Threading.Mutex (true, "App", out checkOther);

 

if (false == checkOther)

{

return ;

}

Application.Run(new Form1());

 

 

}

catch

{

}

finally

{

if (null != m_OneProcess && false != checkOther)

{

m_OneProcess.ReleaseMutex ();

}

}

}

 

 

'프로그래밍 > .Net' 카테고리의 다른 글

C# 메모리 관리 - 마소 발췌  (0) 2014.01.17
Drag & Drop 기능 구현하기  (0) 2014.01.17
String.Format으로 할 수 있는 일들  (0) 2014.01.17
Tick Count 가져오기  (0) 2014.01.17
WaitHandles 사용  (0) 2014.01.17

하기에서 발췌함:

http://www.rkttu.com/346

닷넷 프레임워크를 이용하는 동안, 의외로 곳곳에 훌륭한 기술들이 많이 숨어있습니다. 특히 문자열 처리에 관한 부분은 특별한 경우가 아니면, 기본으로 내장되어있는 API들 (Formatting API와 정규 표현식 API)만으로 쉽게 처리가 가능합니다. 예전 블로그 아티클 중에 정규표현식에 관련된 아티클들이 몇 가지 있으니 이 아티클과 더불어서 보시면 좋을것 같습니다.

 

오늘 살펴보려고 하는 내용은 String Formatting API에 대한 내용입니다.

 

1. 자유자재로 사용하는 치환자

 

대부분의 예제, 대부분의 코드에서는 String Formatting API에 서식 문자열을 지정할 때, 인자 순서대로, 단 한 번씩만 치환자를 사용합니다. 하지만, 같은 치환자를 여러번 중복해서 사용하거나, 인자 순서와는 별개로 지정할 필요는 많습니다. 이럴 때에는, 걱정하지 말고 매개 변수 개수에 유의하면서 치환자를 자유롭게 사용하면 됩니다.

 

String.Format("{0} {1} {1} {4} {3} {2}", 'a', 'b', 'c', 'd', 'e');
// => a b b e d c

 

2. C# 만의 편리한 기능: Verbatim String과 함께 사용하는 강력한 Formatting API

 

여러 줄에 걸친 문자열을 별도의 데이터 파일이 아닌, C# 코드 내에 포함할 수 있다면, 좀 더 String Formatting API를 극적으로 활용할 수 있을 것입니다. 이럴 때, Verbatim String을 활용하면 좋습니다. Verbatim String은 @" 으로 시작하여 " 로 끝이나는 문자열 구문 전체를 말합니다. 이 문자열 블럭 안에는 Back Slash나 CR/LF 등의 문자를 포함할 수 있습니다.

 

String.Format(@"<html>
<head><title>Hello World!</title></head>
<body>
<p>{0}</p>
</body>
</html>", DateTime.Now);

 

다만 유의할 점이 하나 있다면, 문자열이 파일로부터 나타난 것이든, Verbatim String에 의한 것이든, 의미를 다르게 해석할 가능성이 있는 글자 (예: '{' 나 '}' 같은 글자)들은 그 의미를 정확하게 살릴 수 있도록 지정하거나, 같은 문자를 연속으로 두번으로 지정하여 이스케이프 처리해야 합니다. (예: "{{", "}}")

 

String.Format(@"int main(int argc, char **argv) {
return 0;
}");

 

즉, 위의 경우 String.Format 메서드에서 오류를 반환합니다. 치환자 시작 기호 다음에 적절한 수식 대신 다른 문자열들이 열거되기 때문에 치환할 수 없다는 오류가 발생합니다. 위의 경우 중괄호 부분들을 아래와 같이 수정해야 합니다.

 

String.Format(@"int main(int argc, char **argv) {{
return 0;
}}");

 

위의 예시에서는 C 언어 코드에 대한 것을 예로 들었습니다만, 같은 방법으로 C# 프로그래밍 코드를 코드 안에 포함하여 재사용할 수도 있습니다. 또는, IronPython 등의 코드를 Embedding하여 DLR에서 사용할 수 있도록 재구성하는 시나리오도 생각해 볼 수 있을 것입니다.

 

3. 날짜 및 시간 표현을 자유자재로 활용하기

 

아직도 날짜 및 시간 표현을 위하여 문자열을 조립하거나, 알고리즘을 사용하여 오전/오후를 구분하십니까? 그렇게 할 이유가 없습니다. 오히려 좀 더 세밀하고 다양한 기능을 제공하는 기본 기능이 있기 때문입니다.

 

String.Format(@"{0:yyyy-MM-dd}", DateTime.Now); // 2009-01-30
String.Format(@"{0:tt hh:mm:ss}", DateTime.Now); // 오전 01:47:33
String.Format(@"{0:yyyy-MM-dd tt hh:mm:ss}", DateTime.Now); // 2009-01-30 오전 01:48:11

 

만약 오전/오후에 해당하는 문자열을 한글이 아닌 영문 표기 (AM/PM)로 변경하려면 어떻게 해야 할까요? 이럴 때에는 CultureInfo 객체를 Format 메서드에 전달하면 간단해집니다. CultureInfo는 System.Globalization 네임스페이스 안에 있습니다.

 

String.Format(CultureInfo.GetCultureInfo("en-US"), @"{0:tt hh:mm:ss}", DateTime.Now); // AM 04:30:44
String.Format(CultureInfo.GetCultureInfo("ko-KR"), @"{0:tt hh:mm:ss}", DateTime.Now); // 오후 03:03:02
String.Format(CultureInfo.GetCultureInfo("ja-JP"), @"{0:tt hh:mm:ss}", DateTime.Now); // 午後 10:08:03

 

위의 예시에서 주석으로 표시한 것과 같이 현재 시간에서 "오전"과 "오후"에 대한 표현을 해당 국가의 언어의 표기법에 맞추어 표기하고 있습니다. en-US는 언어를 영어로 사용하며 지리적으로 미국을 기준으로 한다는 의미로 해석되며, ko-KR은 언어를 한국어로 사용하고 지리적으로는 대한민국, ja-JP는 언어를 일본어로 사용하고 지리적으로 일본을 기준으로 한다는 의미로 해석됩니다.

 

위와 같이 언어 및 지역 코드를 설정할 때 알아야 할 사항이 두 가지가 있는데, 첫 째는 반드시 언어 코드의 전체 이름을 기재해야 합니다. 예를 들어, en-US에서 en만 지정하면 en에 해당하는 설정은 "중립 문화권"이기 때문에 CultureInfo.GetCultureInfo 메서드로는 받아들일 수 없습니다. 그리고 US만 지정하면 US에 해당하는 코드가 없으므로 역시 오류가 발생합니다. 그리고, 언어 코드가 시간대 설정까지 자동으로 반영하는 것은 아니므로 en-JP (언어는 영어이며 지역은 일본)와 같은 설정은 유효하지 않으며 표준 코드 정의 내역에 없기 때문에 받아들여지지 않습니다. 시간대에 대한 설정은 http://msdn.microsoft.com/ko-kr/library/system.timezone.aspx 에 소개된 TimeZone 클래스 (닷넷 3.5부터 사용 가능합니다)를 활용해야 합니다.

 

4. 통화 금액 표현하기

 

지역 설정을 이용하여 손쉽게 처리할 수 있는 일이 또 한 가지 있는데, 바로 통화 금액 표기에 관한 것입니다. 아래의 코드를 살펴보기로 하겠습니다.

 

String.Format(CultureInfo.GetCultureInfo("es-ES"), "{0:C}", 300); // 300,00 €
String.Format(CultureInfo.GetCultureInfo("ko-KR"), "{0:C}", 300); // ₩300

 

그리고, 좀 더 구체적으로 소수점 자릿수 등을 표현하거나, 음수/양수/영점 표현을 설정하고자 한다면 아래와 같이 활용할 수 있습니다. (Delphi Basic 웹 사이트 http://www.delphibasics.co.uk/RTL.asp?Name=FormatFloat 에서 부분 발췌한 샘플 코드를 올립니다.)

 

// 반올림 예시
String.Format("{0:#####}", 1234.567);
String.Format("{0:00000}", 1234.567);
String.Format("{0:0}", 1234.567);
String.Format("{0:#,##0}", 1234.567);
String.Format("{0:0,0}", 1234.567);

// 소수점 사용 예시
String.Format("{0:0.####}", 1234.567);
String.Format("{0:0.0000}", 1234.567);

// 공학용 표기
String.Format("{0:0.0000000E+00}", 1234.567);
String.Format("{0:0.0000000E-00}", 1234.567);
String.Format("{0:#.#######E-0#}", 1234.567);

// 음수/양수/ZERO 에 따른 표기
String.Format("{0:0.0}", -1234.567);
String.Format("{0:0.0 CR;0.0 DB}", -1234.567);
String.Format("{0:0.0 CR;0.0 DB}", 1234.567);
String.Format("{0:0.0 CR;0.0 DB;Zero}", 0.00);

5. Bonus: 자연스러운 16진수 표기 방법 (String.Format을 사용하지 않습니다.)

 

"0x" + (16).ToString("X8"); // 8자리 16진수 표기, 대문자
"0x" + (33).ToString("x4"); // 4자리 16진수 표기, 소문자

'프로그래밍 > .Net' 카테고리의 다른 글

Drag & Drop 기능 구현하기  (0) 2014.01.17
실행 파일 한번 실행  (0) 2014.01.17
Tick Count 가져오기  (0) 2014.01.17
WaitHandles 사용  (0) 2014.01.17
Thread 동기화 및 AutoResetEvent, WaitHandles  (0) 2014.01.17

MFC의 GetTickCount와 비슷한 C# TickCount 기능

int tick1 = Environment.TickCount;

..............
// 처리~~
..............

int tick2 = Environment.TickCount;
double elaspsed1 = (tick2 - tick1) / 1000.0;
MessageBox.Show(elaspsed1.ToString() + " Sec");

 

'프로그래밍 > .Net' 카테고리의 다른 글

실행 파일 한번 실행  (0) 2014.01.17
String.Format으로 할 수 있는 일들  (0) 2014.01.17
WaitHandles 사용  (0) 2014.01.17
Thread 동기화 및 AutoResetEvent, WaitHandles  (0) 2014.01.17
[C#] Internal 지정자  (0) 2014.01.17

// for Multi wait Object
WaitHandle[] hObj = new WaitHandle[2];
hObj[0] = _hDestroyGrab;
hObj[1] = _hTrigGrabProc;

_hTrigGrabStop.Reset(); // Reset: non-signaled set.. waitone에서 기다리겠다는 의미.
_hIdleGrabProc.Set(); // Set : Grab Proc는 Set 해준다.

int nObjDone = WaitHandle.WaitAny(hObj); // 2개중 어느 하나라도 끝난게 있다면 처리한다.

switch (nObjDone)
{
case 0: // Destory Event set.
return;
case 1: // TrigGrabProc Event set.
break;
default: // 그외 event set된 경우, continue......
continue;
}

 

요렇게 WaitAny로 먼저 Set된놈에 대한 처리가 가능하다.

WaitAll은 모든 event가 set되어야 true가 리턴된다.

 

Thread 동기화 관련하여 네이버 지식인의 답변 내용을 발췌.

 

질문의 요점은 비동기식 프로그램에서 개발자가 원하는 동기화를 하기 위해 C#에서는 어떠한 것이 필요한지에 대한 물음인 것 같네요.

 

원하시는 답변은 방법3에 있는데 방법1과 방법2도 한번 살펴보세요.

 

방법 1. lock 사용

먼저 lock키워드를 사용하는 쉬운 방법이 있습니다.

어떠한 메소드 내에서 자원 경쟁(race condition)을 해야 하는 부분이라고 생각하시면 다음과 같이 하면 여러 쓰레드(혹은 job 객체)에서 먼저 진입해서 빠져 나오기 전까지 대기(wait)하다가 진입한 곳에서 빠져 나오면 진입하게 됩니다.

 

public void Foo()

{
lock (경쟁자원)
{
//to do

}

}

단, 경쟁 자원이 class기반의 개체여야 한다는 제약 조건이 있습니다. 대부분 lock(this)로 해서 경쟁 자원이 있는 class의 경쟁해야 하는 경우에 쉽게 표현할 수 있습니다.

쉬운 반면 자원 해제를 예측한 시간 안에 하지 못한다면 전체 성능을 저하시킬 수 있는 문제를 갖고 있습니다.

 

방법 2. Monotor 사용

lock 키워드와 같은 목적으로 사용할 수 있습니다.

자원 경쟁을 해야 하는 개체가 x라 할 때 다음과 같이 사용(진입)하기 위해 System.Threading.Monitor.Enter메소드를 사용하고 사용이 끝나고 나서 System.Threading.Monitor.Exit을 호출하시면 됩니다.

물론 using System.Threading;을 기재하시면 Monitor.Enter와 Monitor.Exit만 기재해도 되겠죠.

 

System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
//to do
}
finally
{
System.Threading.Monitor.Exit(obj);
}

 

MSDN에 보면 Monitor보다는 lock을 권고하고 있습니다.

Monitor에 대한 자세한 사항을 보시고 싶으면Monitor Synchronization 기술 샘플을 참고하십시요.

 

방법 3. 아마도 질문하신 분이 원하는 답변이 될 듯

오해의 소지를 없애기 위해 MSDN을 발췌하겠습니다.

 

lock 또는 monitor를 사용하면 스레드가 중요한 부분을 차지하는 코드 블록이 동시에 실행되지 않도록 방지할 수 있지만 이러한 구문을 사용하면 한 스레드가 다른 스레드에 이벤트를 전달할 수 없습니다. 이 문제를 해결하기 위해서는 스레드를 활성화하거나 일시 중단하는 데 사용할 수 있고 신호를 받은 상태 및 신호를 받지 않은 상태 중 한 가지 상태가 지정되는 개체인 동기화 이벤트가 필요합니다. 스레드를 일시 중단하려면 신호를 받지 않은 상태의 동기화 이벤트에서 스레드를 대기시키고, 스레드를 활성화하려면 신호를 받은 상태로 이벤트 상태를 변경합니다. 이미 신호를 받은 상태의 이벤트에서 스레드를 대기시키려고 하면 스레드가 지연 시간 없이 계속 실행됩니다.

동기화 이벤트에는 AutoResetEventManualResetEvent라는 두 가지 종류가 있습니다. 이 둘 사이의 유일한 차이는 AutoResetEvent의 경우 스레드를 활성화할 때마다 신호를 받은 상태에서 신호를 받지 않은 상태로 자동으로 변경된다는 점입니다. 반대로, ManualResetEvent를 사용하면 신호를 받은 상태를 통해 스레드를 그 수에 상관없이 활성화할 수 있고 해당Reset 메서드를 호출한 경우에만 신호를 받지 않은 상태로 되돌릴 수 있습니다.

WaitOne,WaitAny 또는 WaitAll 같은 대기 메서드 중 하나를 호출하여 이벤트에 대해 스레드가 대기하도록 할 수 있습니다. WaitHandle..::.WaitOne()은 단일 이벤트가 신호를 받을 때까지 스레드를 대기시키고, WaitHandle..::.WaitAny()는 하나 이상의 지정된 이벤트가 신호를 받을 때까지 스레드를 차단하며,WaitHandle..::.WaitAll()()()은 지정된 모든 이벤트가 신호를 받을 때까지 스레드를 차단합니다. 이벤트는 해당 Set 메서드가 호출되면 신호를 받은 상태로 변경됩니다.

다음 예제에서는 wait함수를 사용하여 스레드를 만들고 시작합니다. 새 스레드는 WaitOne 메서드를 사용하여 이벤트에서 대기합니다. wait 함수를 실행하는 기본 스레드를 통해 이벤트가 신호를 받은 상태가 될 때까지 이 스레드는 일시 중단됩니다. 이벤트가 신호를 받은 상태가 되면 보조 스레드가 반환됩니다. 이 경우 이벤트는 스레드 하나의 활성화에만 사용되므로 AutoResetEvent 또는 :TrackManualResetEvent 클래스를 사용할 수 있습니다.

using System;
using System.Threading;

class ThreadingExample
{
static AutoResetEvent autoEvent;

static void DoWork()
{
Console.WriteLine(" worker thread started, now waiting on event...");
autoEvent.WaitOne();
Console.WriteLine(" worker thread reactivated, now exiting...");
}

static void Main()
{
autoEvent = new AutoResetEvent(false);

Console.WriteLine("main thread starting worker thread...");
Thread t = new Thread(DoWork);
t.Start();

Console.WriteLine("main thread sleeping for 1 second...");
Thread.Sleep(1000);

Console.WriteLine("main thread signaling worker thread...");
autoEvent.Set();
}
}
이 외에도 뮤텍스 개체를 사용할 수도 있습니다.
참고로 이 모든 자료는 MSDN을 참고하고 있으며 C#을 공부하시는 분이라면 MSDN의 C#프로그래밍 가이드를 참고하시면 아주 좋은 Online Guru를 만나실 수 있습니다. MSDN은 제품 메뉴얼이라 할 수 있고 이보다 정확하기는 쉽지 않습니다. 처음에 보기가 힘들지 계속 보다보면 이보다 나을 수가 없어요.
참고로 궁금한 사항이 있으면 jejutour@daum.net으로 메일 보내시면 시간이 되는 한도 내에서 성심성의껏 답변해 드리겠습니다.

그리고, race condition문제에 대한 criticalsection을 결정을 하는데 있어WatiForSingleObject도 Win32API에서도 소극적인 처신이니 Win32API의 동기화 기법을 다시 한 번 확인해 보시길 권합니다.

그밖의 자료들..

 

한동훈의 c# 쓰레드 이야기

http://grandmaster.tistory.com/entry/%ED%95%9C%EB%8F%99%ED%9B%88%EC%9D%98-c-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%9D%B4%EC%95%BC%EA%B8%B0

Thread 란?

http://leeom.blog.me/70095295108

c# 스레드 강좌

http://www.waglwagl.net/

스레드 간 컨트롤 접근과 스레드 동기화 1탄

http://ljh0707.blog.me/10017188903

C# 초보입니다. Win32에 있는 WaitForSingleObject ????

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040102&docId=73502679&qb=YyMg7Iqk66CI65OcIOuMgOq4sO2VqOyImA==&enc=utf8&section=kin&rank=1&search_sort=0&spq=0&pid=giTuIsoi5TwssZc1dFGsss--513569&sid=TZV-RnJqlU0AAEP1GQM

윈폰7 관련 링크

초보자들을 위한 동영상 강의

http://channel9.msdn.com/Series/Windows-Phone-7-Development-for-Absolute-Beginners?page=2

c# 초보자를 위한 레퍼런스 모음

http://cafe.naver.com/ongameserver.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=3334

추천책

C# and the .NET Platform

책비교 사이트

http://www.noranbook.net/

참고블로그

http://blog.naver.com/andro78

http://blog.naver.com/saltynut

http://www.hoons.kr/default.aspx

.net 표준개발 가이드

http://www.microsoft.com/korea/MSDN/netframework/technologyinfo/overview/netdevelopmentguid.aspx

C# 4.0 소개

http://blog.tobegin.net/36

C# 개발자 블로그 - 다양한 경험 공유

http://www.scripter.co.kr/

[출처] c# 관련|작성자 조포크

 

'프로그래밍 > .Net' 카테고리의 다른 글

Tick Count 가져오기  (0) 2014.01.17
WaitHandles 사용  (0) 2014.01.17
[C#] Internal 지정자  (0) 2014.01.17
LoaderLock 관리 디버깅 도우미 문제  (0) 2014.01.17
Handle hWND  (0) 2014.01.17

하기 사이트에서 발췌.

==> http://yhw720.tistory.com/137

일반적인 객체 지향 언어에서는 클래스의 특성 중 하나인 information hiding을 public, private, protected 지정자를 통하여 구현합니다. 이런 지정자는 모두 논리적 특성을 지니고 있으며 한번 지정하면 그 의미가 바뀌지 않습니다. C#에서는 internal 지정자라는 특별한 지정자를 지원하는데 이 지정자는 물리적인 특성을 지니고 있으며 작업단위가 바뀔 때 마다 그 의미가 바뀌게 됩니다.


1. Internal 지정자
(1) Internal 지정자의 정의
- 동일한 .NET assembly에서 접근 가능한 레벨을 지정하는 지정자

(2) Internal 지정자의 특징
- .NET assembly에서 접근 가능한 레벨을 지정하는 지정자
- 다른 지정자와는 달리 물리적인 특성 소유
- 현실 세계의 모습을 잘 표현

(3) Internal 지정자를 사용하는 이유
- 객체를 이용하여 작업을 수행할 경우 혼자만으로 수행되는 작업은 거의 존재하지 않음
- 대부분의 작업은 다른 클래스와 객체와 연관되어 수행
- 자신과 상속 관계가 없는 일반적인 클래스와 공동작업을 하기 위한 새로운 지정자 필요
- public 지정자는 아무에게나 공개되므로 부적합
- private 지정자는 자신만 사용할 수 있으므로 부적합
- protected 지정자는 상속 관계를 맺어야만 하므로 부적합

2. Internal access 모델
(1) access 레벨 간의 비교
- public -> 논리적 특성을 지니며 아무나 사용 가능
- private -> 논리적 특성을 지니며 자신만 사용 가능
- protected -> 논리적 특성을 지니며 후손만 사용 가능
- Internal -> 물리적 특성을 지니며 assembly 그룹에서만 사용 가능

 

'프로그래밍 > .Net' 카테고리의 다른 글

WaitHandles 사용  (0) 2014.01.17
Thread 동기화 및 AutoResetEvent, WaitHandles  (0) 2014.01.17
LoaderLock 관리 디버깅 도우미 문제  (0) 2014.01.17
Handle hWND  (0) 2014.01.17
C# 가변인자 만들어 넣기  (0) 2014.01.17

예외처리하면됨.

 

디버그메뉴 -> 예외 ->Managed Debugging Assistants -> LoaderLock 선택해제 -> [확인]

 

VC++ 개발품과 연동하는과정에서 발생되는것으로 판단됨

'프로그래밍 > .Net' 카테고리의 다른 글

Thread 동기화 및 AutoResetEvent, WaitHandles  (0) 2014.01.17
[C#] Internal 지정자  (0) 2014.01.17
Handle hWND  (0) 2014.01.17
C# 가변인자 만들어 넣기  (0) 2014.01.17
문자열중 숫자 가려내기  (0) 2014.01.17

하기에서 참조함.

http://hslee.net/xe/200

WIN32 API DLL 을 사용하다 보면.. 함수 인자가 HWND 라는게 가끔있다.

int LoadTTS(HANDLE hwnd, uint umsg, int enSpeechType);

위와같은????

C# 에서 DLL 포팅해줄때에는

 

1.[DllImport("HCITTS.dll", CharSet = CharSet.Auto)]
2.public static extern int LoadTTS(IntPtr hwnd, uint umsg, int enSpeechType);


이렇게 해주면된다.. intPtr = 핸들값을 가지는 int형 변수 이다..

그러고 나서 실제 사용할때에는

LoadTTS(this.handle,0,0);

이런식으로 사용하면 된다.

 

'프로그래밍 > .Net' 카테고리의 다른 글

[C#] Internal 지정자  (0) 2014.01.17
LoaderLock 관리 디버깅 도우미 문제  (0) 2014.01.17
C# 가변인자 만들어 넣기  (0) 2014.01.17
문자열중 숫자 가려내기  (0) 2014.01.17
xml과 datagridview 데이터 중복 검사  (0) 2014.01.17

하기에서 참조하였음.. 출처 감사드립니다...

 

프로젝트를 간단하게 콘솔프로젝트로 ParamLesson 이라고 주었습니다.

 

어떤 함수를 만들 것이냐하면요 ㅇㅅㅇ

숫자의 뭉치를 주면 전부 합쳐서 리턴시키는 함수를 만들겁니다.

기본적으로 아래와 같이 만들 수 있겠지요.

숫자의 뭉텅이를 그냥 배열로 넘겨주었습니다.

하지만, static 메소드가 아니면, 인스턴스를 만들어 호출해야하니,

메소드에 static 메소드를 붙여주겠습니다. ㅎ

아래와 같이 만들고 SumOfAll을 호출하면 되겠지요 ㅇㅅㅇ ?!

우선, 출력한번 해보겠습니다.

음, 정상적으로 나오는 것을 확인하실 수 있습니다.

그런데, 배열을 만들어 넘겨야 한다는 점이 조금 짜증이 나지요 ㅇㅅㅇ...

변수를 넘긴다면, 변수로 배열을 또 만들어서 넘겨야하니, 여간 불편한 일이 아닐 수 없습니다.

C나 Java 모든 언어에서 이러한 불편한 일을 막기위해서 변수를 여러개 꼽을 수 있게 만드는 녀석을 지원합니다.

C에서 예를 들면 printf("",A,B,C,D...) 과 같이 나가는데, 인수가 가변적이죠.

이러한 메소드를 가변인수 메소드(함수)라고 합니다.

C#에서는 이러한 녀석을 만들기 위해 params 라는 녀석을 지원합니다.

아래와 같이 배열 앞에 params 라고 적어주시면 됩니다.

메소드 내에 나머지는 그냥 가만히 두었습니다.

다만, 호출 부분을 봐주시기 바랍니다.

그냥 1,2,3,4,5 하고 꼽은 모습을 보실 수 있으실 겁니다.

이와 같이, 1,2,3,4,5 하고 간단하게 꼽으면 내부적으로 알아서 배열이 만들어 지게 된답니다.

가변인수 메소드를 만들어보았습니다.

실행하시면 위와 같은 결과를 얻으실 수 있으실 겁니다.

간단하죠 ㅇㅅㅇ ?!

'프로그래밍 > .Net' 카테고리의 다른 글

LoaderLock 관리 디버깅 도우미 문제  (0) 2014.01.17
Handle hWND  (0) 2014.01.17
문자열중 숫자 가려내기  (0) 2014.01.17
xml과 datagridview 데이터 중복 검사  (0) 2014.01.17
Savefiledialog 구현하기  (0) 2014.01.17

// 얻어온 ID 중에 문자열이 있는지를 체크한다.


string szBuff = "123TEST";

foreach (char cData in szBuff)
{
// 숫자가 아니라면...
if (Char.IsNumber(cData) == false)

................

}

 

'프로그래밍 > .Net' 카테고리의 다른 글

Handle hWND  (0) 2014.01.17
C# 가변인자 만들어 넣기  (0) 2014.01.17
xml과 datagridview 데이터 중복 검사  (0) 2014.01.17
Savefiledialog 구현하기  (0) 2014.01.17
datagridview에서 keydown 처리  (0) 2014.01.17

+ Recent posts