Maison  >  Article  >  développement back-end  >  Introduction détaillée à la différence entre out et ref en C# (image et texte)

Introduction détaillée à la différence entre out et ref en C# (image et texte)

黄舟
黄舟original
2017-03-29 11:53:311563parcourir

Cet article présente principalement les connaissances pertinentes sur out et ref. Il a une certaine valeur de référence, examinons-le avec l'éditeur ci-dessous

Pour bien comprendre C#out et ref, vous devez d'abord clarifier les deux concepts suivants (Si vous maîtrisez bien les types de valeur et les types de référence, vous pouvez sauter "1. Clarifier deux concepts de base")

1. Clarifier deux concepts de base

Type de valeur :

Définition : Passé par valeur, c'est-à-dire que les paramètres réels sont passés aux paramètres formels (les termes paramètres formels et paramètres réels ne sont pas définis ici ) .

Méthode de stockage : Principalement dans la pile.

Essence : implémenté via le transfert de valeur, le formulaire de copie

copy et les méthodes Pop() et Push() de la pile d'appels.

Types courants : int, float, bool, enum, struct, Array, etc.

Exemple de type de valeur :

//主函数
 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;
 }
Analyse : Le code ci-dessus, par transfert de valeur, ne modifie pas les valeurs de n1 et n2 après l'échange de deux variables. le transfert de valeur est En copiant le formulaire, la valeur originale n'est pas modifiée. L'image est la suivante :

1)

Définissez les variables n1 et n2, et initialisez les variables La représentation en mémoire est à peu près la suivante (int n1 = 10, n2 = 20 ;)

Code

Débogage

représente en mémoire

2) Quand l'exécution de la méthode des variables d'échange

Débogage du code

représente en mémoire

Diagramme détaillé des étapes d'échange

Type de référence :

Définition : transmis par adresse, comme un pointeur dans c++. En termes simples, considérez simplement l’adresse comme la clé de la porte.

Méthode de stockage : principalement stocké dans le tas.

Essence : transmis par adresse, variables partagées, un changement, tous les changements.

Types courants : Chaîne,

Objet, etc.

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的值\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;
}
résultat:

Débogage

Diagramme schématique

2 Pourquoi out et ref sont introduits

Cela peut être. Comme le montre l'analyse ci-dessus, le transfert de valeur ne peut pas modifier la valeur d'une variable. Que dois-je faire si je souhaite modifier la valeur d'une variable comme C++ ?

c# introduit et ref pour résoudre ce problème. Par conséquent, out et ref sont des types de référence.

2. Explication détaillée de out

En une phrase : out ne peut qu'entrer mais pas sortir.


//主函数
 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;
 }
résultat :

fonctionnalités :

1. La définition de la méthode et l'appel de la méthode doivent utiliser le mot-clé out. (Le code ci-dessus est évidemment facile à voir)

2. out ne sort que mais pas in, c'est-à-dire qu'il a pour fonction d'effacer les paramètres externes de la méthode. (Dans le code ci-dessus, les lecteurs peuvent modifier arbitrairement les valeurs de n1 et n2. Tant que le corps de la méthode GetSum() n'est pas modifié, la valeur de sortie est 13)

3. taper. (Si vous l'appelez directement sans définir n1 et n2 à l'avance, la compilation ne passera pas)

4 Pour les fonctions du même nom, out n'existe pas avec ref en même temps, et peut être <.>surchargé

.

//如下两个方法可以重载
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. Explication détaillée de la réf

En une phrase : il y a une entrée et il y a une sortie.

//主函数
 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有进有出。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn