using System;
// C++ 과 다른 C#의 핵심 문법들
// 1. Property : 구현자 입장에서는 함수(제어문 가능)
// 사용자 입장에서는 Data처럼 보인다.
// 2. indexer : C++의 배열 연산자 재정의..
class Bike
{
private int gear;
private int[] array = new int[10]; // C#의 배열 만드는 법.
public int Gear
{
get { return gear; }
set { if( value < 100 ) gear = value; }
}
public int this[int name] // set_Item( name, value ) 함수로 제공된다.
{
get { return array[name]; }
set { array[name] = value; }
}
}
class Test
{
public static void Main()
{
Bike p = new Bike();
p.Gear = 10;
Console.WriteLine("{0}", p.Gear);
}
}
//////////////////////////////////////////////////////
// out 파라미터와 Ref 파라미터
// 결국 항상 C처럼 메모리 그림을 그려서 해결하면 됩니다.
class Point
{
public int x;
}
class Test
{
public static void foo(out Point p)
{
//p.x = 20;
p = new Point();
p.x = 100;
}
public static void Main()
{
Point p1 = new Point();
p1.x = 10;
foo(out p1);
Console.WriteLine("{0}", p1.x);
}
}
class Test
{
public static void foo(out int a)
{
a = 20;
}
public static void Main()
{
int x = 10;
foo(out x);
Console.WriteLine("{0}", x);
}
}
//////////////////////////////////////////////////////////
// 결국 C++ : type 사용자가 메모리의 위치 결정
// C# : type 제작자가 메모리의 위치 결정
// 무조건 참조 type이다.
class Point1
{
public int x;
public int y;
}
// 구조체는 무조건 값 type이다. stack에 객체가 만들어 진다.
struct Point2
{
public int x;
public int y;
}
class Test
{
public static void Main()
{
Point1 p1; // 참조 일 뿐이다.
Point2 p2; // 객체이다.
Point1 p3 = new Point1(); // 힙에 만든다.
Point2 p4 = new Point2(); // stack에 만든다.
// int는 구조체이다.
int a;
Point1 pp; // 실제 Point1이 아니고 C++의 포인터개념이다.
// (C#에서는 레퍼런스라고 한다.)
//Point1 p = new Point1; // C++
Point1 p = new Point1(); // C#
int a = 0;
int b = new int();
}
}