C\#의 out 과 ref 를 자세히 설명 합 니 다.

5434 단어 outref
C\#out 과 ref 를 충분히 이해 하려 면 다음 과 같은 두 가지 개념 을 명 확 히 해 야 한다.
1.두 가지 기본 개념 을 명 확 히 한다.
값 종류:
 정의:값 의 방식 으로 전달 합 니 다.즉,실제 매개 변 수 는 형식 매개 변수 에 전달 합 니 다(형 삼 과 실 삼 용어 에 대해 서 는 정의 되 지 않 습 니 다).
 저장 방식:주로 창고 에 있 습 니 다.
 본질:값 전달,copy 던 전 형식 을 통 해 스 택 의 Pop()과 Push()방법 을 호출 합 니 다.
 일반적인 유형:int,float,bool,enum,struct,Array 등.
 값 형식 예:

//   
 static void Main(string[] args)
 {
  //      n1 n2,    
  int n1 = 10, n2 = 20;
  Console.WriteLine("   n1 n2  ");
  Console.WriteLine("n1={0},n2={1}", n1, n2);//n1=10,n2=20
  Swap(n1,n2);
  Console.WriteLine("   n1 n2  ");
  Console.WriteLine("n1={0},n2={1}",n1,n2);//n1=10,n2=20
  Console.Read();
 }
 /// <summary>
 ///         
 /// </summary>
 /// <param name="n1">  n1</param>
 /// <param name="n2">  n2</param>
 static private void Swap(int t1,int t2)
 {
  int temp;
  temp =t1;
  t1 =t2;
  t2 = temp;
 }
분석:상기 코드 는 값 을 통 해 전달 되 고 두 변 수 를 교환 한 후에 n1 과 n2 의 값 을 바 꾸 지 않 았 습 니 다.근본 적 인 원인 은 값 전달 은 copy 사본 형식 을 통 해 원 가 를 바 꾸 지 않 았 기 때 문 입 니 다.그림 은 다음 과 같다.
1)변 수 를 n1 과 n2 로 정의 하고 변 수 를 초기 화 합 니 다.메모리 에 있 는 표 시 는 대체적으로 다음 과 같 습 니 다(int n1=10,n2=20;).  
코드 디 버 깅

메모리 에 표시

2)교환 변수 방법 을 실행 할 때
코드 디 버 깅


메모리 에 표시

상세 절차 설명도 교환

참조 형식:
      정의:c++의 지침 과 같은 주 소 를 통 해 전달 합 니 다.통속 적 으로 주 소 를 문 을 여 는 열쇠 로 삼 으 면 된다.
      저장 방식:주로 더미 에 저 장 됩 니 다.
      본질:주소 로 전달,공유 변수,하나의 변화,모든 변화.
      일반적인 유형:String,Object 등.
code:c++

// Cpplus.cpp :              。
//
#include "stdafx.h"
//   
int _tmain(int argc, _TCHAR* argv[])
{
 void Swap(int *x, int *y);
 int n1 = 10, n2 = 20;
 printf("   n1 n2  
"); printf("%d,%d
", n1, n2); Swap(&n1,&n2); printf(" n1 n2
"); printf("%d,%d",n1,n2); getchar(); return 0; } // void Swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; }
result:

디 버 깅


설명도

2.왜 아웃 과 ref 를 도입 합 니까?
상기 분석 을 통 해 알 수 있 듯 이 값 전달 은 변수의 값 을 바 꿀 수 없습니다.c++처럼 변수의 값 을 바 꾸 려 면 어떻게 해 야 합 니까?c\#이 문 제 를 해결 하기 위해 out 과 ref 를 도입 했다.따라서 out 과 ref 는 모두 인용 유형 에 속한다.
2.out 상세 설명
한 마디 로 아웃 은 들 어 갈 수 없다.

//   
 static void Main(string[] args)
 {
  int n1, n2;
  Console.WriteLine(GetSum(out n1,out n2));
  Console.Read();
 }
 //out  
 static public int GetSum(out int numberFirst,out int numberSecond)
 {
  numberFirst = 10;
  numberSecond = 3;
  return numberFirst + numberSecond;
 }
result:

out 특징:
1.방법 정의 와 호출 방법 은 모두 out 키 워드 를 표시 해 야 합 니 다.(위 코드 와 같이 보기 쉽다)
2.out 은 들 어가 지 않 습 니 다.즉,비 우 는 방법 으로 체 외 매개 변수 기능 을 가지 고 있 습 니 다.(위의 코드 와 같이 독 자 는 n1 과 n2 의 값 을 임의로 바 꿀 수 있 습 니 다.GetSum()방법 체 를 바 꾸 지 않 으 면 출력 값 은 모두 13 입 니 다)
3.인용 형식 입 니 다.(n1 과 n2 를 미리 정의 하지 않 고 직접 호출 합 니 다.컴 파일 이 통과 되 지 않 습 니 다)
4.동명 함수,out 는 ref 와 동시에 존재 하지 않 으 며 다시 불 러 올 수 있 습 니 다.

//          
public void getNumer(int num){}
public void setTime(out int num){num=10;}
//          
public void getNumer(ref int num){num=10;}
public void setTime(out int num){num=10;}
3.ref 상세 설명
한 마디 로 들 어 가 는 것 도 있 고 나 오 는 것 도 있다.

//   
 static void Main(string[] args)
 {
  int n1=1, n2=3;
  Console.WriteLine(refGetSum(ref n1,ref n2));
  Console.Read();

 } 
 //ref  
 static public int refGetSum(ref int numberFirst, ref int numberSecond)
 {
  numberFirst = 10;
  numberSecond = 3;
  return numberFirst + numberSecond;
 }
ref 특징: 
   1.방법 정의 와 호출 방법 은 ref 키 워드 를 사용 해 야 합 니 다.(위 코드 와 같이 보기 쉽다)
   2.ref 는 들 어가 고 나 오 면 값 을 방법 체 내 에 전달 할 수 있 습 니 다.(위의 코드 와 같이 독 자 는 n1 과 n2 의 값 을 임의로 바 꿀 수 있다)
   3.인용 형식 입 니 다.(n1 과 n2 를 미리 정의 하지 않 고 직접 호출 합 니 다.컴 파일 이 통과 되 지 않 습 니 다)
   4.동명 함수,out 는 ref 와 동시에 존재 하지 않 으 며 다시 불 러 올 수 있 습 니 다.
4.out 과 ref 의 공통점 과 차이 점
주요 차이 점 은 out 에서 yuan'chuang 만 수출 하고 ref 는 들 어 오고 나 간다.
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기