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의-비교

Console Class

http://msdn.microsoft.com/en-us/library/system.console.aspx

Console 클래스에는 ReadLine, WriteLine 같은 기본적인 입출력 메서드 외에도 콘솔 관리를 위한 여러 가지 멤버들이 제공된다. 어떤 멤버는
함수처럼 필요할 때 호출할 수 있는 메서드이고 어떤 것은 값을 읽고 쓰는 프로퍼티 형태로 되어 있다.

멤버

설명

Title

콘솔창의
제목
문자열이다.

BackgroundColor, ForegroundColor

전경색, 배경색의
색상이다.

CursorSize

커서의
높이를
지정한다.

CursorVisible

커서의
보임/숨김을
지정한다.

CursorLeft, CursorTop

커서의
현재
위치이다.

Clear()

화면을
지운다.

Beep()


소리를
낸다.

ResetColor()

디폴트
색상으로
변경한다.

SetCursorPosition(x,y)

커서의
위치를
옮긴다.

class Program
{
public
static void Main()
{
        Console.Title = “콘솔 테스트”; // 콘솔창의 제목
        Console.BackgroundColor = ConsoleColor.Blue; // 콘솔창의 배경색
Console.ForegroundColor = ConsoleColor.Yellow; // 콘솔창의 전경색
        Console.Clear(); // 콘솔창 화면을 깨끗이 지움
Console.Beep(); // 콘솔창에 삑소리를 냄
Console.WriteLine(“색상을 변경했습니다.”); // 콘솔창에 “색상을 변경했습니다.” 출력
Console.ReadKey(); // 콘솔창에서 아무키나 입력받길 대기
Console.ResetColor(); // 콘솔창에서 색상(배경,전경)을 초기화
        Console.SetCursorPosition(10, 10); // (10, 10) 좌표로 커서를 이동
Console.WriteLine(“디폴트 색상입니다.”); //  콘솔창에 “디폴트 색상입니다.” 출력
Console.ReadKey(); // 콘솔창에서 아무키나 입력받길 대기
    }
}

Stack vs 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

http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap

Main Method

 http://msdn.microsoft.com/ko-kr/library/acy3edy3(v=vs.100).aspx

– Main 메서드는 프로그램 제어가 시작되고 끝나는 .exe 프로그램의 진입점입니다.

– Main은 클래스 또는 구조체 내부에 선언됩니다.Main은 static이어야 하며 public이 아니어야 합니다.이전 예제에서 이 메서드에는 기본 액세스 수준인 private이 지정되었습니다. 이 메서드의 바깥쪽 클래스나 구조체는 정적일 필요가 없습니다.

 

– Main은 void 또는 int 반환 형식일 수 있습니다.

 

– Main 메서드는 명령줄 인수를 포함하는 string[] 매개 변수가 있거나 없는 상태로 선언할 수 있습니다.Visual Studio를 사용하여 Windows Forms 응용 프로그램을 만드는 경우 수동으로 매개 변수를 추가하거나 Environment 클래스를 사용하여 명령줄 인수를 가져올 수 있습니다.매개 변수는 명령줄 인수(0부터 시작)로 읽습니다. C 및 C++와 달리 프로그램의 이름은 첫 번째 명령줄 인수로 취급되지 않습니다.

 

class Program
{
static void Main(string[] args)
{
// Display the number of command line arguments:
System.Console.WriteLine(args.Length);
}
}