티스토리 뷰
이번에는 ref와 out을 알아 볼 것 인데
보통 C# 에서는 포인터를 사용하지 않습니다 그 이유가 CLR이 메모리를 자동 관리 해준다고 하기 때문에 직접 메모리를 건드는 것은 안전하지 않으므로 포인터는 사용하지 않고 메모리를 건드는 것이 아닌 참조자를 이용하는거 같습니다.(C#에서도 포인터를 사용 할 수 있다만 함수에 unsafe를 붙여야 한다)
C++ 에서의 참조자는 int& 형으로 변수를 만들었는데 C#에선 &가 아닌 ref라는 단어를 붙여줘야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int a = 100; int b = 200;
Plus(ref a, 200); Console.WriteLine(a);
Plus(ref a, 100); Console.WriteLine(a);
Console.WriteLine("a = {0} , b = {1}", a, b); Swap(ref a, ref b); Console.WriteLine("a = {0} , b = {1}",a,b); }
static void Plus(ref int a,int b) { a += b; }
static void Swap(ref int a,ref int b) { int temp = a; a = b; b = temp; } } }
|
이 소스코드를 실행 하면 잘 돌아간다(당연)
이제 out을 소개 할 것 인데 차이점은 딱 한가지 이다.
Ref는 사용하려면 변수를 초기화 해야한다. 그러나 out은 그럴 필요가 없다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int a; int b = 30;
Plus(out a, 200); Console.WriteLine(a);
Plus(out a, 100); Console.WriteLine(a);
Console.WriteLine("a = {0} , b = {1}", a, b); Swap(out a, out b); Console.WriteLine("a = {0} , b = {1}",a,b); }
static void Plus(out int a,int b) { a = 100;
a += b; }
static void Swap(out int a, out int b) { a = 100; b = 300;
int temp = a; a = b; b = temp; } } }
|
… 문제점 이라 함은 C#은 변수 초기화를 하지 않으면 에러를 내뿜는다 그래서 out으로 초기화 하지 않은 걸 넘겨주어도 초기화나 값의 대입은 꼭 해주어야 에러가 발생 하지 않는다.(더럽게 짜증나네)
'C#' 카테고리의 다른 글
6. sealed (0) | 2016.05.07 |
---|---|
5. 배열 (0) | 2016.05.07 |
4. params (0) | 2016.05.07 |
개인/C# 문법/2. foreach (0) | 2016.05.07 |
C#의 데이터 형(Type)들 (0) | 2016.05.07 |