Convert.ToInt32() vs Int32.Parse() vs 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″; 
intresult;
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

C# Formatting Numeric String

Formatting Standard Numeric Format Strings http://msdn.microsoft.com/en-us/library/s8s7t687(VS.80).aspx

Formatting Custom Numeric Format Strings http://msdn.microsoft.com/en-us/library/0c899ak8.aspx

Formatting Numeric Format Strings (Alignment)
-Integer http://www.csharp-examples.net/string-format-int/
-Double http://www.csharp-examples.net/string-format-double/
-DateTime http://www.csharp-examples.net/string-format-datetime/
-Align String with Spaces http://www.csharp-examples.net/align-string-with-spaces/
-Indent String with Spaces http://www.csharp-examples.net/indent-string-with-spaces/
-IFormatProvider http://www.csharp-examples.net/iformatprovider-numbers/
-Custom IFormatProvider http://www.csharp-examples.net/custom-iformatprovider/

String.Substring Method

http://msdn.microsoft.com/ko-kr/library/system.string.aspx

Substring(Int32) 이 인스턴스에서 부분 문자열을 검색합니다. 부분 문자열은 지정된 문자 위치에서 시작됩니다.
Substring(Int32, Int32) 이 인스턴스에서 부분 문자열을 검색합니다. 부분 문자열은 지정된 문자 위치에서 시작하고 길이도 지정되어 있습니다.

string str = “Hi, Welcome to HCI Programming II! Hi”;
Console.WriteLine(“str의 substring(3) {0}”, str.Substring(3)); // ” Welcome to HCI Programming II! Hi” 3번째 위치에서 떼어냄

Console.WriteLine(“str의 substring(14, 20) {0}”, str.Substring(14,20)); // ” HCI Programming II!” 14번째 위치에서부터 20개 만큼 떼어냄

C# Struct

C++에서는 struct와 class간에 차이가 거의 없으며, 차이점은 아무런 명시를 하지 않았을 때 class는 멤버가 private 권한을 가지고, struct는 멤버가 public 권한을 가진다.

C#에서는 struct와 class가 유사하나 매우 다른 특징을 가진다.
-C# struct는 Value Type (값 형식)으로, 즉 stack영역에 데이터를 생성해서 사용함
-C# struct는 Default Constructor (기본생성자)나 Destructor(소멸자)선언할 수 없음
-C# struct는 다른 struct/class를 상속받을 수 없으며 파생시킬수도 없음 (따라서, protected는 선언할 수 없음)
-C# struct는 interface를 구현할 수 있음
-C# struct는 nullable type으로 사용할 수 있음
-C# struct는 일반적으로 new를 사용해서 객체를 생성하나 (예: Person p = new Person();),
stack영역에 데이터를 생성해서 사용함

public struct Point
{
int x = 1; //Illegal: cannot initialize field
int y;

public Point() { } //Illegal: cannot have parameterless constructor
public Point(int x) { this.x = x; } //Illegal: must assign field y
}
http://www.codeproject.com/Articles/8612/Structs-in-C

Tuple vs KeyValuePair

static Tuple<int, int> GetDivideQuotientRemainder(int a, int b)

{

return new Tuple<int, int>((a / b), (a % b));

}
static KeyValuePair<int, int> GetDivideQuotientRemainder2(int a, int b)

{

return new KeyValuePair<int, int>((a / b), (a % b));

}
static void GetDivideQuotientRemainder3(int a, int b, out int q, out int r)

{

q = (a / b);
r = (a % b);

}

static void Main(string[] args)
{

var value = GetDivideQuotientRemainder(23, 4);
Console.WriteLine(“q = {0} r = {1}”, value.Item1, value.Item2);

var value2 = GetDivideQuotientRemainder2(23, 4);
Console.WriteLine(“q = {0} r = {1}”, value2.Key, value2.Value);

int q = 0;
int r = 0;
GetDivideQuotientRemainder3(23, 4, out q, out r);
Console.WriteLine(“q = {0} r = {1}”, q, r);

}

Enum

Enum.GetValues method returns an array that contains a value for each member of the enumType enumeration.

https://msdn.microsoft.com/en-us/library/system.enum.getvalues(v=vs.110).aspx

enum Gender { Male=100, Female=200 };

// PrintAllGender()는 Male=100, Female=200 출력

public void PrintAllGender ()

{

foreach (Gender g in Gender.GetValues(typeof(Gender)))

{

Console.WriteLine(“{0}={1}”, g, (int)g);

}

}

// PrintByGender(..) 는 Male이면 남자, Female이면 여자 출력

public void PrintByGender (Gender g)

{

switch (g)

{

case Gender.Male:

Console.WriteLine(“남자”);

break;

case Gender.Female:

Console.WriteLine(“여자”);

break;

default:

Console.WriteLine(“중성자??”);

break;

}

}

Tuple (C# 4.0)

튜플은 여러 개의 멤버를 가지는 데이터 구조임 (멤버는 8개까지 가능).
C++의 std::pair 형식과 비슷함.
C#의 KeyValuePair<Tkey, TValue>는 struct 이고, Tuple은 class 임.

var p = new Tuple<string, int>(“HCI”, 2015);
// Item1, Item2, …, Item7, Rest (the final property)
Console.WriteLine(“p={0} {1}”, p.Item1, p.Item2);

// Create() factory method can construct from a 1-tuple to an 8-tuple
var p1 = new Tuple<int, string, double>(1, “hello”, 3.14);
var p2 = Tuple.Create(2, “hci”, 0.001); // Tuple<int, string, double>

// For higher than 8 items, use nested tuple
var p3 = new Tuple<int, int, int, int, int, int, int, Tuple<int, int>>(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9));
Console.WriteLine(“8th={0} 9th={1}”, p3.Rest.Item1, p3.Rest.Item2);

// Use tuple for method return

Tuple<int, int>GetDivideQuotientRemainder(int a, int b)

{

return new Tuple<int, int>( (a/b), (a%b));

}

var value = GetDivideQuotientRemainder(23, 4)

Console.WriteLine(“q={0} r={1}”, value.Item1, value.Item2);

C# Data Type

Boolean (bool) BoolType.cs

Character (char) CharType.cs

Enumeration (enum) EnumType.cs

Numeric (int, long, float, double, decimal, etc) NumericType.cs

String StringType.cs

Object ObjectType.cs

Struct StructType.cs
StructTest StructTest.cs

Array ArrayTest.cs

int, float, double, char, bool http://www.hoons.kr/Lecture/LectureMain.aspx?BoardIdx=151&kind=4&view=0

enum, struct http://csharpstudy.com/CSharp/CSharp-struct.aspx

String http://www.hoons.kr/Lecture/LectureMain.aspx?BoardIdx=48205&kind=53&view=0

System.Object http://www.hoons.kr/Lecture/LectureMain.aspx?BoardIdx=155&kind=4&view=0

Generics (C# 2.0) http://www.hoons.kr/Lecture/LectureMain.aspx?BoardIdx=153&kind=4&view=0

Nullable (C# 2.0) http://csharpstudy.com/CSharp/CSharp-datatype.aspx

var (implicit type) (C# 3.0)http://msdn.microsoft.com/ko-kr/library/bb383973.aspx

Value Type vs Reference Type

구분 값 형식(Value Type) 참조 형식(Reference Type)
종류 내장형 (int, char, float,…)사용자 정의형 (enum, stuct) Object, string, class, interface, delegate, ..
메모리 사용 스택 스택, 힙
대입(Assignment) 복사 참조 변경
크기 고정 가변
Garbage Collector 지원 지원 안됨 지원 됨

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

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

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

참조형식(Reference Type)은 참조형식끼리 할당 할때 참조값만을 복사한다.

http://dis.dankook.ac.kr/lectures/hci10/entry/Value-Type과-Reference-Type의-비교