Category Archives: C# Programming

Convert.ToInt32()와 Int32.Parse()와 Int32.TryParse() 비교

http://www.codeproject.com/KB/cs/AgileWare_Convert_Int32.aspx

Convert.ToInt32(string s)는 내부적으로 Int32.Parse(string s)을 불러서 string을 32-bit signed integer로 변환시켜주는 메소드

string s1 = 1234″;
string s2 = 1234.65″;
string s3 = null;
string s4 = 123456789123456789123456789123456789123456789″;

int result;
bool success;

result = Convert.ToInt32(s1); //— 1234
result = Convert.ToInt32(s2); //— FormatException
result = Convert.ToInt32(s3); //— 0
result = Convert.ToInt32(s4); //— OverflowException


Int32.Parse(string s)는 strng을 32-bit signed integer로 변환시켜주는 메소드
그러나 만약 s가 null일 경우 ArgumentNullException을 냄
또한 s가 integer가 아닐 경우 FormatException을 냄
또한 s가 integer의 MinValue또는 MaxVale를 넘칠 경우 OverflowException을 냄

result = Int32.Parse(s1); //— 1234
result = Int32.Parse(s2); //— FormatException
result = Int32.Parse(s3); //— ArgumentNullException
result = Int32.Parse(s4); //— OverflowException


Int32.TryParse(string s, out int i)는 string을 32-bit signed integer로 변환하여 out 에 보내주는 메소드로 성공하면 true를 반환
따라서 만약 s가 null일 경우 ArgumentNullException을 내지않고 false와 out으로 0을 반환
또한 s가 integer가 아닐 경우 FormatException을 내지않고 false와 out으로 0을 반환
또한 s가 integer의 MinValue또는 MaxVale를 넘칠 경우 OverflowException을 내지않고 false와 out으로 0을 반환


success = Int32.TryParse(s1, out result); //— success => true; result => 1234
success = Int32.TryParse(s2, out result); //— success => false; result => 0
success = Int32.TryParse(s3, out result); //— success => false; result => 0
success = Int32.TryParse(s4, out result); //— success => false; result => 0

const 상수와 readonly 상수의 비교

const 상수(constant)은 컴파일타임(compile-time) 상수이다.
readonly 상수(constant)은 런타임(run-time) 상수이다.

// const
public const int Millennium = 2000;
public const double PI = 3.141592;

// readonly
public static readonly int ThisYear = 2010;
public class MyClass
{
    public readonly double PI;
    public MyClass()
    {
        PI = 3.141592;
    }
}


const 상수는 선언하는 순간부터 static 된다.
const 상수를 선언함과 동시에 초기화를 해주어야 한다.
const 상수는 컴파일시 값이 결정 되어져 있어야 한다.

readonly 상수는 static 키워드를 사용하면 static 상수가 된다. 사용하지 않으면 일반상수가 된다.
readonly 상수는 const 키워드를 사용하는 것처럼 반드시 초기화 필요없.
readonly 상수는 생성자를 통해서 런타임시 값이 결정될 있다.
한번 값이 결정되면 다시는 값을 변경할 수는 없다.

Value Type과 Reference Type의 비교

값형식(Value Type)은 메모리를 직접 가리킨다.
참조형식(Reference Type)은 메모리를 참조를 통해서 가리킨다.

값형식(Value Type)은 변수의 선언과 동시에 메모리에 생성한다.
참조형식(Reference Type)은 변수의 선언과 메모리 생성 분리하여 생성한다.

값형식(Value Type)은 값형식끼리 할당 메모리의 값들을 그대로 복사한다.
참조형식(Reference Type)은 참조형식끼리 할당 할때 참조값만을 복사한다.

Stack과 Heap 비교

스택(Stack)은 Last-In, First-Out(LIFO) 방식으로 아이템을 저장하는 메모리의 자료 구조이다.
스택(Stack)은 지역변수(local variable)와 함수 리턴주소를 저장한다. C#에서 값형식(Value Type) 데이터는 스택에 저장된다.

힙(Heap)은 프로그램 코드 영역과는 별도로 유지되는 자유 메모리 공간이다.
힙(Heap)은 C#에서 new를 사용하여 메모리 할당하여 이 공간을 사용할 수 있다.
힙에 할당된 데이터는 전역변수(global variable)처럼 프로그램이 종료될 때까지 유지된다.
C#에서는 더이상 참조하지 않는 데이터를 자동으로 해제해준다 (gabage collection).
C#에서는 참조형식(Reference Type)은 스택에 메모리 주소를 저장하고 힙에 실질적인 데이터가 저장된다.

http://en.csharp-online.net/Stack_vs._Heap