ホームページ  >  記事  >  バックエンド開発  >  C# の out と ref の違いの詳細な紹介 (画像とテキスト)

C# の out と ref の違いの詳細な紹介 (画像とテキスト)

黄舟
黄舟オリジナル
2017-03-29 11:53:311511ブラウズ

この記事では主にoutとrefの関連知識を紹介します。特定の参照値があります。以下のエディターで見てみましょう

C# out と ref を完全に理解するには、まず次の 2 つの概念を明確にする必要があります (値の型と参照型をよりよく理解する、 「1. 2 つの基本概念を明確にする」は省略できます )

1. 2 つの基本概念を明確にします

値の型:

定義: 値渡し、つまり実パラメータから仮パラメータへの転送 (仮パラメータと実パラメータの用語(ここでは定義されていません)。

保管方法:主に積み重ねて保管します。

本質: 値の転送、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;
 }

分析: 上記のコードは 2 つの変数を交換した後、値がコピーの形式で渡されることが根本的な理由です。元の値は変更されません。図は次のとおりです。

1) 変数 n1 と n2 を定義し、変数を初期化します。 メモリ内の表現はおおよそ次のとおりです (int n1 = 10, n2 = 20;)

コードデバッグ

メモリ内手段

2) 交換変数メソッド実行時

コードデバッグ

メモリ内手段

Exchange詳細手順図

参照型:

定義: C++ のポインターなど、アドレスによって渡されます。平たく言えば、住所がドアの鍵であると考えてください。

保存方法:主にヒープに保存されます。

本質: アドレス、共有変数、1 つの変更、すべての変更によって渡されます。

一般的なタイプ: 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的值\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;
}

result:

Debugging

概略図

2. out と ref が導入される理由

上からもわかります値の転送が不可能であると分析 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;
 }

result:

out の機能:

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。