>  기사  >  백엔드 개발  >  C#의 out과 ref의 차이점에 대한 자세한 소개(그림 및 텍스트)

C#의 out과 ref의 차이점에 대한 자세한 소개(그림 및 텍스트)

黄舟
黄舟원래의
2017-03-29 11:53:311512검색

이 글은 주로 out과 ref에 대한 관련 지식을 소개합니다. 특정 참조 값이 있으므로 아래 편집기로 살펴보겠습니다

C# out 및 ref를 완전히 이해하려면 먼저 다음 두 가지 개념을 명확히 해야 합니다(값 유형과 참조 유형을 잘 이해하셨다면 "1. 두 가지 기본 개념을 명확히 하세요")

1. 두 가지 기본 개념을 명확하게 하세요

값 유형:

정의: 값으로 전달됨, 즉 실제 매개변수가 형식 매개변수에 전달됩니다(형식 매개변수 및 실제 매개변수에 관한 용어는 여기서 정의되지 않음). ) .

보관방법 : 주로 스택에 보관.

본질: 값 전송, 복사 복사 양식, 호출 스택의 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의 값이 변경되지 않는다는 것입니다. 값은 원래 값을 변경하지 않고 복사 복사 양식을 통해 전달됩니다. 그림은 다음과 같습니다.

1) 변수 n1과 n2를 정의하고, 변수를 초기화합니다. 메모리에서의 표현은 대략 다음과 같습니다(int n1 = 10, n2 = 20;).

코드디버그

는 메모리에 나타남

2) 언제 교환변수 메소드 실행

코드 디버깅

은 메모리에 나타남

교환 세부 단계 다이어그램

참조 유형:

정의: 포인터와 같은 주소로 전달 씨++. 일반인의 관점에서 보면 주소를 문 열쇠라고 생각하면 됩니다.

저장 방법: 주로 힙에 저장됩니다.

본질: 주소, 공유 변수, 한 번의 변경, 모든 변경으로 전달됩니다.

일반적인 유형: 문자열, 객체

코드: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的值\n");
 printf("%d,%d\n", n1, n2);
 Swap(&n1,&n2);
 printf("交换后n1和n2的值\n");
 printf("%d,%d",n1,n2);
 getchar();
 return 0;
}
//交换函数
void Swap(int *x, int *y)
{
 int temp = *x;
 *x = *y;
 *y = temp;
}

결과:

디버그

개략도

2. 변수 값을 변경할 수 없는 이유는 무엇입니까? C++와 같은 변수의 값을 변경하려면 어떻게 해야 합니까? c#

이 문제를 해결하기 위해 out과 ref를 소개했습니다. 따라서 out과 ref는 모두 참조 유형입니다.

2. out에 대한 자세한 설명

한 문장으로 말하면 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;
 }

결과:

아웃 기능:

1. 메소드 정의와 메소드 호출 모두에 out 키워드를 사용해야 합니다. (위 코드는 확실히 보기 쉽습니다)

2. out은 out만 나가고 in은 안 됩니다. 즉, 메소드의 외부 매개변수를 삭제하는 기능이 있습니다. (위 코드에서 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同时存在,可以重载。

四、out与ref异同

主要区别,out只输出yuan'chuang,ref有进有出。

위 내용은 C#의 out과 ref의 차이점에 대한 자세한 소개(그림 및 텍스트)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.