Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in den Unterschied zwischen out und ref in C# (Bild und Text)

Detaillierte Einführung in den Unterschied zwischen out und ref in C# (Bild und Text)

黄舟
黄舟Original
2017-03-29 11:53:311512Durchsuche

In diesem Artikel werden hauptsächlich die relevanten Kenntnisse zu Out und Ref vorgestellt. Es hat einen gewissen Referenzwert, schauen wir es uns mit dem Editor unten an

Um C# out und ref vollständig zu verstehen, müssen Sie zunächst die folgenden zwei Konzepte klären (Wenn Sie Werttypen und Referenztypen gut verstehen, können Sie „1. Zwei Grundkonzepte klären“ überspringen)

1. Zwei Grundkonzepte klären

Werttyp:

Definition: Als Wert übergeben, d. h. Aktualparameter werden an Formalparameter übergeben (Begriffe zu Formalparametern und Aktualparametern werden hier nicht definiert ).

Speichermethode: Hauptsächlich im Stapel.

Essenz: Implementiert durch Wertübertragung, Kopieren Kopierformular und die Methoden Pop() und Push() des Aufrufstapels.

Gängige Typen: int, float, bool, enum, struct, Array usw.

Beispiel für einen Werttyp:

//主函数
 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: Der obige Code ändert die Werte von n1 und n2 nach dem Austausch zweier Variablen nicht Die Wertübertragung erfolgt. Durch das Kopieren des Formulars wird der Originalwert nicht verändert. Das Bild sieht wie folgt aus:

1) Variablen n1 und n2 definieren und die Variablen initialisieren. Die Darstellung im Speicher ist ungefähr wie folgt (int n1 = 10, n2 = 20;)

CodeDebugging

stellt im Speicher dar

2) Wann Ausführen der Austauschvariablenmethode

Code-Debugging

stellt im Speicher dar

Detailliertes Schrittdiagramm austauschen

Referenztyp:

Definition: Übergeben durch Adresse, z. B. einen Zeiger in c++. Laienhaft ausgedrückt: Stellen Sie sich die Adresse einfach als den Schlüssel zur Tür vor.

Speichermethode: Hauptsächlich im Heap gespeichert.

Essenz: Übergeben durch Adresse, gemeinsam genutzte Variablen, eine Änderung, alle Änderungen.

Häufige Typen: String, Objekt usw.

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;
}

Ergebnis:

Debuggen

Schematische Darstellung

Warum out und ref eingeführt werden

Das kann sein Aus der obigen Analyse geht hervor, dass die Wertübertragung den Wert einer Variablen nicht ändern kann. Was soll ich tun, wenn ich den Wert einer Variablen wie in C++ ändern möchte? c# führte out und ref ein, um dieses Problem zu lösen. Daher sind sowohl out als auch ref Referenztypen.

2. Ausführliche Erklärung von out

In einem Satz: out kann nur eintreten, aber nicht austreten.


//主函数
 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;
 }

Ergebnis:

out Features:

1. Sowohl die Methodendefinition als auch der Methodenaufruf müssen das Schlüsselwort out verwenden. (Der obige Code ist offensichtlich leicht zu erkennen)

2. Out geht nur raus, aber nicht rein, das heißt, es hat die Funktion, die externen Parameter der Methode zu löschen. (Im obigen Code können Leser die Werte von n1 und n2 beliebig ändern. Solange der Körper der GetSum()-Methode nicht geändert wird, ist der Ausgabewert 13)

3 Es handelt sich um eine Referenz Typ. (Wenn Sie es direkt aufrufen, ohne n1 und n2 im Voraus zu definieren, wird die Kompilierung nicht erfolgreich sein)

4 Bei Funktionen mit demselben Namen existiert out nicht gleichzeitig mit ref und kann überlastet.

//如下两个方法可以重载
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. Ausführliche Erläuterung von Ref

In einem Satz: Es gibt einen Eingang und es gibt einen Ausgang.

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

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in den Unterschied zwischen out und ref in C# (Bild und Text). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn