블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2804)
Unity3D (860)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (234)
협업 (61)
3DS Max (3)
Game (12)
Utility (140)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
C함수 정의
extern unsigned int image_decode_header(const unsigned char *in, unsigned char *frames, unsigned char *bpp, unsigned short *width, unsigned short *height);

extern unsigned int image_decompress(const unsigned char *in, void *out);

extern int image_configure(const unsigned char *in, int start_x, int start_y, int lcd_type, int lcd_color);

C#함수 정의
[DllImport("lite_dll.lib")] static extern int image_configure([In] byte[] input, int start_x, int start_y, int lcd_type, int lcd_rotate , int lcd_color);
[DllImport("lite_dll.lib")] static extern int image_decode_header([In] byte[] input, ref byte frames, ref byte bpp, ref short width, ref short height);
[DllImport("lite_dll.lib")] static extern int image_decompress([In,Out] byte[] input, [In,Out] byte[] output);

아래는 사용법입니다.
image_configure(byImgArray , 0 , 0 , 0 , 0 , 0);
image_decode_header(byImgArray , ref rlsData.byFrame, ref rlsData.bitdepth , ref rlsData.width , ref rlsData.height);
image_decompress(byImgArray , rlsData.byRlsArray);
반응형
Posted by blueasa
, |
프로세스와 스레드에 대한 개념은 어떤 프로그래밍 언어라 하더라두 공통으로 적용이 되는 부분입니다. C#에서 스레드를 사용하는 방식은 파라미터(Parameter)가 있냐 없냐에 따라서 달라집니다. 

파라미터(Parameter)가 없는 경우 
파라미터가 없는 경우에는 간단합니다. Thread 객체를 선언해 주고, 정의하는 과정에서 ThreadStart 를 만들어주면서 스레드가 동작시킬 함수명을 적어주면 됩니다. 

자 한번 볼까요?

Thread th = new Thread(new ThreadStart(test));
th.Start();

test 함수의 경우 void test() 가 생성되어 있어야 합니다. 위와 같이 적으면 스레드 객체를 생성하고 동작시킬 함수를 연결하고 바로 시작(Start()) 됩니다. 물론, 선언 따로, 정의 따로 시작따로 할수도 있겠죠. 



파라미터(Parameter)가 있는 경우 
파라미터가 있는 경우도 크게 어렵지는 않습니다만 Thread 객체를 정의할때, 조금 달라집니다. ThreadStart 대신에 ParameterizedThreadStart를 사용해서 Thread 객체와 동작시킬 파라미터가 있는 함수를 연결시킵니다. 

Thread th = new Thread(new ParameterizedThreadStart(test));
th.Start("Hello World");

public void test(string s)
{
...
}

위의 소스코드에서 보는것 처럼, 자신이 전달 하려는 파라미터 값에 대해서는 Start() 함수를 통해서 전달할 수가 있습니다. Start() 함수는 Overload되어있기 때문에 파라미터가 없이 Start()를 할수도 있지만, object 으로 파라미터를 전달해 주기도 합니다. 

참고로 .NET 1.1 Version 에서는 파라미터가 있는 경우에 대해서는 스레드의 지원이 안되었다고 합니다. 참고하세요^^ 

반응형
Posted by blueasa
, |

- 테이블에 자신의 키와 자기 부모의 키를 가지고 있는경우 재귀함수를 이용해 트리뷰를 구성

 

 

RwNm : 노드이름

RwCd : 노드키

PrntRw : 자신의 부모키

 

#region 트리뷰구성
private TreeNode CreateNode(string RwNm,string RwCd)
{
    //자신의 하위노드가 없을때까지 찾는다   

    TreeNode node = new TreeNode();
    node.Name = RwCd;
    node.Text = RwNm;

    foreach (DataRow r in RwCdTable.Rows)
    {
          if (RwCd == r["PrntRw"].ToString()) //자신의 키를 부모키로 갖고있는 노드검색
          {
              //System.Diagnostics.Debug.WriteLine(RwCd+ "->"+r["RwCd"].ToString());

              

              //재귀호출
              node.Nodes.Add(CreateNode(r["RwNm"].ToString(),

                                                        r["RwCd"].ToString()));                      
           }
     }
     return node; //자신의 하위노드를 다찾은 노드를 반환
}
#endregion

 

//함수사용

trvRw.Nodes.Add(CreateNode(strRwLevlNm,"00000000"));

 

자료구조시간에 배운 재귀함수를 회사에서 써먹게될줄이야...


출처 : http://blog.naver.com/tjr0807?Redirect=Log&logNo=150005240319

반응형
Posted by blueasa
, |
흔히 string 객체 중 null일 때 참조하여
exception을 내는 경우를 방지하기 위하여
아래와 같이 코딩하는 경우가 있는데
매번 이와 같이 하는 것도 귀찮은 일이다.

string str = null;
...

if(str != null && str.length > 0)
{
...
}

그러나 위와 같은 check를 하는 함수가 string class에 static function으로 존재한다.
모르면 손발이 고생 ;;
string.IsNullOrEmpty(str)
반응형
Posted by blueasa
, |

※ C#에서 호출시 C++/CLI 에서 리턴값, 파라미터값은 다음과 같이 처리합니다.

 

 [ String - BSTR (LPCTSTR) ]

// ex: Set

bool SetTestString(String^ strTestString)
{
   axTestCtrl1->TestString= strTestString;
   return true;

}

// ex: Get
String^ GetTestString()
{
   return axTestCtrl1->TestString;
}

short, int, long ]

 

: short, int, long 형은 그냥 주고 받으면 됩니다.

// ex: Set

bool SetShortVal(short nShortVal)
{
   axTestCtrl1->ShortVar = nShortVal;
   return true;
}

// ex: Get
short GetShortVal()
{
   return axTestCtrl1->ShortVal;
}

struct ]

// ex: 참조 가능한 구조체 선언

ref struct EocsTestStruct
{
   String^ eocsstrVal;
   short eocsnVal;
   long eocslnVal;
}

 

// ex: 구조체를 파라미터로 받아서 Set

bool SetEocsTestStruct(EocsTestStruct^% EocsTest)

{

   try

  {
      axTestCtrl1->ShortVar = nShortVal;

      axTestCtrl1->eocsstrVal= EocsTest->eocsstrVal;

      axTestCtrl1->eocsnVal= EocsTest->eocsnVal;
      axTestCtrl1->eocslnVal= EocsTest->eocslnVal;
      return true;

   }

   catch (Exception^ e) 
   {
       MessageBox::Show(e->Message);
       return false;
   }
}

...

... ING ... : 다른 케이스도 작업하다가 정리할 예정입니다.

...

반응형
Posted by blueasa
, |

gcnew로 생성하지 않기

 

C++/CLI는 클래스를 생성할 때 ‘gcnew’를 사용하지 않고 생성할 수도 있습니다.

 

리스트 1. ‘gcnew’를 사용하지 않고 클래스 생성하기 >

#include "stdafx.h"

#include <stdio.h>

 

using namespace System;

 

ref class ManagedTest

{

public:

           ManagedTest() { Console::WriteLine(L"New ManagedTest"); }

           ~ManagedTest() { Console::WriteLine(L"delete ManagedTest"); }

          

           void func() { Console::WriteLine(L"Call func() - {0}", nNumber ); }

 

           int nNumber;

};

 

void foo1()

{

           ManagedTest MTest;

           MTest.nNumber = 1;

           MTest.func();

}

 

void foo2()

{

           ManagedTest^ MTest = gcnew ManagedTest();

           MTest->nNumber = 2;

           MTest->func();

}

 

int main(array<System::String ^> ^args)

{

           foo1();

           foo2();

          

           getchar();

           return 0;

}


결과 >


<리스트 1> ManagedTest MTest; 는 비 관리 C++처럼 GC가 아닌 스택 영역에 생성하는 것으로 착각할 수도 있겠지만 전혀 아닙니다클래스를 생성하면 언제나 GC 영역에 만들어집니다

위의 코드는 그냥 ‘gcnew’ 사용을 우리가 생략하고 컴파일러가 대신 써 준다고 생각하시면 됩니다.

 

void foo1()

{

           ManagedTest MTest;

           MTest.nNumber = 1;

           MTest.func();

}

은 컴파일러에 의해서 아래의 코드로 바뀝니다.

void foo1()

{

           ManagedTest^ MTest = gcnew ManagedTest();

           MTest->nNumber = 1;

           MTest->func();

           delete MTest;

}

 

위의 코드를 보시면 아시듯이 gcnew를 사용하지 않고 클래스를 생성하면 우리가 직접 delete를 쓰지 않아도 되는 편리함을 얻을 수 있습니다.

gcnew를 사용하지 않는 것은 C#에서 ‘using’을 간략화 시킨 것으로 생각하면 좋습니다.


< C# using 문 사용 예 >

using (Graphics g = this.CreateGraphics())

{

    g.DrawLine(Pens.Black, new Point(0,0), new Point(3,5));

}

 

 

 

 

value 클래스

 

관리 클래스는 복사 생성자와 대입 연사자를 가지지 못하므로 아래의 코드는 컴파일 에러가 발생합니다.

 

리스트 2. >

#include "stdafx.h"

#include <stdio.h>

 

using namespace System;

 

ref class C {

    int i;

};


void func(C c) {}


int main()

{

    C c;

    C d;

    func(c);   // 에러

    d = c;     // 에러

}

 

그러나 클래스를  ‘ref’가 아닌 ‘value’ 클래스로 정의하면 위의 코드는 컴파일 할 수 있습니다.

 

#include "stdafx.h"

#include <stdio.h>

 

using namespace System;

 

value class C {

    int i;

};

void func(C c) {}

int main()

{

    C c;

    C d;

    func(c);   // 에러

    d = c;     // 에러

}

 

value 클래스는 클래스간 복사를 할 수 있는 능력이 있습니다이 복사는 비트 단위의 복사로 이른바 ‘memcpy’와 같은 복사입니다.

value 클래스는 복사를 할 수 있으므로 value 클래스의 멤버는 절대 복사 가능한 멤버만 가질 수 있습니다그래서 아래와 같은 value 클래스 C는 컴파일 에러가 발생합니다.

 

ref class A

{

  int i;

};

 

value class C

{

  A a;

};

 

 

 value 클래스의 특징으로는 ref 클래스가 GC에서 만들어지는 것과 달리 스택에 만들 수 있습니다.

value class C

{

};

 

C c;

 

위 코드에서 클래스는 스택에 만들어집니다(물론 gcnew를 사용하면 GC에 만들어집니다)

 

value 클래스의 특징은 좀 더 있는데 위에 설명한 것들과 포함해서 아래와 같이 정리할 수 있습니다.

 


value 클래스의 특징

 

1. 기본 생성자를 가질 수 없다.

2. 복사 생성자를 가질 수 없다.

3. 대입 연산자를 가질 수 없다.

4. 소멸자를 가질 수 없다.

5. finalize를 가질 수 없다.

6. 클래스간 복사를 할 수 있다.

7. 복사 불가능한 것을 멤버로 가질 수 없다(ref 클래스 등).

8. 스택에 생성할 수 있다.

9. 다른 클래스를 계승할 수 없다( interface는 가능하다)

 

 

 


관리 클래스를 파라메터로 넘기기

 

ref class A

{

           int i;

};

 

void foo1( A a )

{

}

 

함수 foo1의 파라미터 정의는 클래스 A value 클래스일 때만 사용할 수 있습니다그러므로 아래와 같이 foo1의 파라미터를 정의해야 합니다.

void foo1( A^ a )

{

}

 

 

 

 

그 외….

 

C++/CLI에서 참조는 ‘%’을 사용합니다이것은 비 관리의 ‘&’와 구별이 됩니다.

%는 아래와 같은 경우에 유용하게 사용할 수 있습니다.

void foo( A^ a )

{

}

 

A a;

// foo( a );  // 에러

foo( %a ); // 성공


참조는 C#에서는 'ref', VB.NET에서는 'ByRef'와 같다고 생각하시면 됩니다.


// 값을 참조로 넘기는 경우

void valuebyref(int%i)
{
   i=5;
}

// 참조형을 참조로 넘기기
void refbyref(String^%s)
{
   s="newstring";
}

void main()
{
   int i=1;

   valuebyref(i);

   String^s="basestring";
   refbyref(s);
}
( 위 코드는 http://adversaria-june.blogspot.com/2006/08/ccli_26.html 에서 인용했습니다 )

 



구조체는 관리나 비 관리나 다른 점은 없습니다.


 

참조와 구조체는 너무 짧게 끝나버렸네요^^;


출처 : http://vsts2010.net/323

http://vsts2010.net/323

반응형
Posted by blueasa
, |

C C++의 큰 차이점의 하나가 바로 C++에만 있는 클래스입니다또 클래스는 객체 지향 프로그래밍 언어에서 자주 볼 수 있습니다.

 

C++/CLI에서 관리 클래스는 ‘ref’라는 키워드를 사용하여 만듭니다.

 

비 관리 클래스

class Test

{

};

 

관리 클래스

ref class Test

{

};

 

관리 클래스는 ‘ref’를 제외하고는 외관상으로는 비 관리 클래스와 비슷하지만 관리와 비 관리가 많이 다르듯이 관리 클래스는 비 관리 클래스와 다른점이 있습니다. 그러므로 이것을 잘 파악하고 있어야 합니다.

 

 

 

관리 클래스의 특징

 

1. 정적 할당은 안 된다무조건 가비지컬렉션(GC)에 동적으로 생성한다.

 

2. 복사 생성자를 만들 수 없다.

 

3. ‘^’(핸들이라고 부른다)과 ‘gcnew’를 사용하여 클래스를 생성한다당근 메모리 해제는 GC에서 관리한다.

 

4. 핸들은 네이티브의 ‘*’(포인터나 ‘&’(참조)와 비슷한 것으로 더 안정스럽다.

 

5. ‘delete’는 명시적으로 클래스에서 사용하고 있는 리소스를 해제할 때 사용하는 것으로 소멸자가 호출 되는 것이지 메모리에서 해제하는 것은 아니다 delete GC에 있는 메모리를 해제하는 것은 아니다.

 

6. delete로 소멸자를 호출하면 GC에 의해서 진짜 파괴될 때 소멸자는 호출되지 않는다.

(소멸자를 선언한 클래스는 자동적으로 IDisposable 인터페이스를 구현한다소멸자는 컴파일러에 의해서Dispose() 메소드로 치환된다).

 

7. 소멸자 이외에 'finalize'를 선언할 수 있다. finalize GC에서 인스턴스가 파괴될 때 호출된다 delete로 소멸자를 호출한 경우에는 finalize는 호출되지 않는다.

 

8. finalize는 ‘!’ 키워드를 사용한다.

 

 

 

관리 클래스 사용해 보기

 

코드 1. 관리 클래스 정의 및 사용 >

#include "stdafx.h"

 

using namespace System;

 

ref class ManagedTest

{

public:

           ManagedTest() { Console::WriteLine(L"New ManagedTest"); }

           ~ManagedTest() { Console::WriteLine(L"delete ManagedTest"); }

           !ManagedTest() { Console::WriteLine(L"finalize ManagedTest"); }

};

 

int main(array<System::String ^> ^args)

{

           Console::WriteLine(L"1.");

          ManagedTest^ MTest1 = gcnew ManagedTest();

           delete MTest1;

 

           Console::WriteLine(L"2.");

           ManagedTest^ MTest2 = gcnew ManagedTest();

          

           return 0;

}

 

결과 >





<코드 1> 설명



그림 1. <코드 1>의 소스 코드와 결과 >

 

<그림 1> 코드를 보면 3번의 ‘gcnew’, 4번의 ‘^’를 사용하여 ManagedTest를 생성하였습니다

<코드 1>에는 없지만 핸들은 포인터와 같은 것으로 관리 클래스의 멤버를 사용할 때는 ‘->’를 사용합니다.

5 delete를 사용하면 소멸자가 호출되어서 6번이 출력됩니다.

MTest2는 소멸자를 호출하지 않아서 8번에서 정의한 finalize가 프로그램이 종료할 때 호출됩니다(7).


 

<코드 1>은 아주 짧고 단순한 코드이지만 관리 클래스의 대부분의 특징을 다 나타내고 있습니다관리 클래스에 대한 설명은 아직 남아 있습니다이것은 다음 회에 또 설명하겠습니다.


출처 : http://vsts2010.net/314

cnf

반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |
tree view에서 포커스가 사라질 때에도 선택된 트리 노드에서 강조 표시된 상태를 유지할지 여부를 나타내는 값을 가져오거나 설정합니다.


포커스를 잃었을 때 강조 표시가 되지 않는 모습
HideSelection = true; (default)



포커스를 잃었을 때 강조 표시가 되는 모습
HideSelection = false;



자세한 내용은 MSDN 참조
http://msdn.microsoft.com/ko-kr/library/system.windows.forms.treeview.hideselection.aspx


반응형
Posted by blueasa
, |

C# 문자열은 string 키워드를 사용하여 선언된 문자의 배열입니다. 문자열 리터럴은 다음 예제에서처럼 따옴표를 사용하여 선언됩니다.

string s = "Hello, World!";

다음과 같이 부분 문자열을 추출하고 문자열을 연결할 수 있습니다.

string s1 = "orange";
string s2 = "red";

s1 += s2;
System.Console.WriteLine(s1);  // outputs "orangered"

s1 = s1.Substring(2, 5);
System.Console.WriteLine(s1);  // outputs "anger"

문자열 개체는 한 번 만들어지면 변경할 수 없는 "변경 불가능" 개체입니다. 문자열에 대해 동작하는 메서드는 실제로 새 문자열 개체를 반환합니다. 이전 예제에서 s1과 s2의 내용이 결합되어 단일 문자열이 만들어질 때, "orange"와 "red"를 포함하는 두 문자열은 모두 변경되지 않습니다. += 연산자는 결합된 내용을 포함하는 새 문자열을 만듭니다. 결과적으로 s1도 다른 문자열을 참조하게 됩니다. "orange" 만 포함하는 문자열은 여전히 존재하지만, s1이 결합되는 시점에서 더 이상 참조되지 않습니다.

Note참고

문자열에 대한 참조를 만들 때는 주의해야 합니다. 문자열에 대한 참조를 만든 다음 해당 문자열을 "수정"할 경우 해당 참조는 문자열을 수정할 때 만든 새 개체가 아니라 원래 개체를 계속해서 가리킵니다. 다음 코드에서는 이를 보여 줍니다.

string s1 = "Hello";
string s2 = s1;
s1 += " and goodbye.";
Console.WriteLine(s2); //outputs "Hello"

문자열을 수정하면 새 문자열 개체가 만들어지므로 대량의 연결 작업이나 기타 관련된 문자열 조작 작업을 수행할 경우에는 성능상의 이유로 다음과 같이 StringBuilder 클래스를 사용해야 합니다.

System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("one ");
sb.Append("two ");
sb.Append("three");
string str = sb.ToString();

StringBuilder 클래스에 대해서는 "Stringbuilder 사용" 단원에서 자세히 설명합니다.

문자열 작업

이스케이프 문자

"\n"(줄 바꿈) 및 "\t"(탭) 등의 이스케이프 문자를 문자열에 포함할 수 있습니다. 예를 들어, 다음 줄은

string hello = "Hello\nWorld!";

다음 줄과 동일합니다.

Hello

World!

백슬래시를 포함하려면 앞에 백슬래시가 하나 더 있어야 합니다. 예를 들어, 다음 문자열은

string filePath = "\\\\My Documents\\";

다음 문자열과 동일합니다.

\\My Documents\

@ 기호

@ 기호를 사용하면 문자열 생성자가 이스케이프 문자와 줄 바꿈을 무시하도록 할 수 있습니다. 따라서 다음 두 개의 문자열은 동일합니다.

string p1 = "\\\\My Documents\\My Files\\";
string p2 = @"\\My Documents\My Files\";

ToString()

Object에서 파생된 모든 개체와 마찬가지로 문자열에서는 값을 문자열로 변환하는 ToString 메서드를 제공합니다. 이 메서드를 사용하면 다음과 같이 숫자 값을 문자열로 변환할 수 있습니다.

int year = 1999;
string msg = "Eve was born in " + year.ToString();
System.Console.WriteLine(msg);  // outputs "Eve was born in 1999"

개별 문자 액세스

SubString()Replace(),Split() 및 Trim() 등의 메서드를 사용하여 문자열에 포함된 개별 문자에 액세스할 수 있습니다.

string s3 = "Visual C# Express";

System.Console.WriteLine(s3.Substring(7, 2));         // outputs "C#"
System.Console.WriteLine(s3.Replace("C#", "Basic"));  // outputs "Visual Basic Express"

또한 다음과 같이 문자를 문자 배열에 복사할 수 있습니다.

string s4 = "Hello, World";
char[] arr = s4.ToCharArray(0, s4.Length);

foreach (char c in arr)
{
    System.Console.Write(c);  // outputs "Hello, World"
}

다음과 같이 인덱스를 사용하여 문자열의 개별 문자에 액세스할 수 있습니다.

string s5 = "Printing backwards";

for (int i = 0; i < s5.Length; i++)
{
    System.Console.Write(s5[s5.Length - i - 1]);  // outputs "sdrawkcab gnitnirP"
}

대/소문자 바꾸기

문자열의 문자를 대문자 또는 소문자로 변경하려면 다음과 같이 ToUpper() 또는 ToLower()를 사용합니다.

string s6 = "Battle of Hastings, 1066";

System.Console.WriteLine(s6.ToUpper());  // outputs "BATTLE OF HASTINGS 1066"
System.Console.WriteLine(s6.ToLower());  // outputs "battle of hastings 1066"

비교

두 문자열을 비교하는 가장 간단한 방법은 대/소문자 구분 비교를 수행하는 == 및 != 연산자를 사용하는 것입니다.

string color1 = "red";
string color2 = "green";
string color3 = "red";

if (color1 == color3)
{
    System.Console.WriteLine("Equal");
}
if (color1 != color2)
{
    System.Console.WriteLine("Not equal");
}

또한 문자열 개체에는 한 문자열이 다른 문자열보다 작은지(<) 또는 큰지(>)에 따라 정수 값을 반환하는CompareTo() 메서드가 있습니다. 문자열을 비교할 때는 유니코드 값을 사용하며, 소문자 값이 대문자 값보다 작습니다.

string s7 = "ABC";
string s8 = "abc";

if (s7.CompareTo(s8) > 0)
{
    System.Console.WriteLine("Greater-than");
}
else
{
    System.Console.WriteLine("Less-than");
}

다른 문자열 내에서 문자열을 검색하려면 IndexOf()를 사용합니다. IndexOf()는 검색 문자열을 찾지 못한 경우 -1을 반환하고, 검색 문자열을 찾은 경우에는 이 문자열이 처음 나타나는 위치의 인덱스(0부터 시작)를 반환합니다.

string s9 = "Battle of Hastings, 1066";

System.Console.WriteLine(s9.IndexOf("Hastings"));  // outputs 10
System.Console.WriteLine(s9.IndexOf("1967"));      // outputs -1

문자열을 부분 문자열로 분할

문장을 개별 단어로 분할하는 등 문자열을 부분 문자열로 변환하는 것은 일반적인 프로그래밍 작업입니다.Split() 메서드는 공백 문자 등의 구분 기호 char 배열을 받아 부분 문자열의 배열을 반환합니다. 다음과 같이foreach를 사용하여 이 배열에 액세스할 수 있습니다.

char[] delimit = new char[] { ' ' };
string s10 = "The cat sat on the mat.";
foreach (string substr in s10.Split(delimit))
{
    System.Console.WriteLine(substr);
}

이 코드는 다음과 같이 각 단어를 별도의 줄에 출력합니다.

The

cat

sat

on

the

mat.

Null 문자열 및 빈 문자열

빈 문자열은 문자가 들어 있지 않은 System.String 개체의 인스턴스입니다. 빈 문자열은 다양한 프로그래밍 시나리오에서 빈 텍스트 필드를 나타내는 데 매우 일반적으로 사용됩니다. 빈 문자열은 유효한 System.String개체이므로 빈 문자열에서 메서드를 호출할 수 있습니다. 빈 문자열은 다음과 같이 초기화됩니다.

string s = "";

이와 반대로, null 문자열은 System.String 개체의 인스턴스를 참조하지 않으며 null 문자열에서 메서드를 호출하려고 하면 항상 NullReferenceException이 발생합니다. 그러나 다른 문자열과의 연결 및 비교 연산에서는 null 문자열을 사용할 수 있습니다. 다음 예제에서는 null 문자열을 참조할 때 예외가 throw되는 경우와 그렇지 않은 경우를 보여 줍니다.

string str = "hello";
string nullStr = null;
string emptyStr = "";

string tempStr  = str + nullStr; // tempStr = "hello"
bool b = (emptyStr == nullStr);// b = false;
emptyStr + nullStr = ""; // creates a new empty string
int I  = nullStr.Length; // throws NullReferenceException

StringBuilder 사용

StringBuilder 클래스는 프로그램에서 수행할 문자열 조작 작업이 많을 경우 성능을 향상시켜 주는 문자열 버퍼를 만듭니다. 또한 StringBuilder 문자열을 사용하면 개별 문자를 다시 할당할 수 있습니다. ���러한 기능은 기본 제공 데이터 형식에서는 지원하지 않습니다. 예를 들어 다음 코드에서는 새 문자열을 만들지 않고 문자열의 내용을 변경합니다.

System.Text.StringBuilder sb = new System.Text.StringBuilder("Rat: the ideal pet");
sb[0] = 'C';
System.Console.WriteLine(sb.ToString());
System.Console.ReadLine();

이 예제에서는 StringBuilder 개체를 사용하여 숫자 형식의 집합에서 문자열을 만듭니다.

class TestStringBuilder
{
    static void Main()
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        // Create a string composed of numbers 0 - 9
        for (int i = 0; i < 10; i++)
        {
            sb.Append(i.ToString());
        }
        System.Console.WriteLine(sb);  // displays 0123456789

        // Copy one character of the string (not possible with a System.String)
        sb[0] = sb[9];

        System.Console.WriteLine(sb);  // displays 9123456789
    }
}

자세한 내용

C# 프로그래머 참조:

참고 항목







반응형
Posted by blueasa
, |