ホームページ > バックエンド開発 > C#.Net チュートリアル > C# の out と ref についてどう思いますか?それらの違いを調べてください

C# の out と ref についてどう思いますか?それらの違いを調べてください

php是最好的语言
リリース: 2018-08-02 16:23:12
オリジナル
1894 人が閲覧しました

C# を学習していると、似ていながらも使用法が異なる言語コマンドなどに必ず遭遇します。今日は、C# の out と ref の違いについて説明します。まず、使用法について説明します。それぞれの、以下に out と ref の違いをまとめます。 apache php mysql

どちらもアドレスで渡され、元のパラメータの値は使用後に変更されます。

ref はパラメーターの値を関数に渡すことができますが、out はパラメーターをクリアする必要があります。つまり、out から値を渡すことはできません。out が入力された後、パラメーターの値は空になります。そのため、一度初期化する必要があります。これがこの2つの違いで、一部のネチズンが言ったように、refは出入りの両方を意味し、outは外出するだけで中には入らないことを意味します。

ref (C# リファレンス)

ref キーワードを使用すると、パラメーターが参照によって渡されます。その結果、制御が呼び出し側メソッドに戻されると、メソッド内のパラメータへの変更が変数に反映されます。 ref パラメーターを使用するには、メソッド定義とメソッド呼び出しの両方で明示的に ref キーワードを使用する必要があります。 ######例えば:###############

1

23{
4

5

6

###7###

8

9

10

11

12

13

14

クラス

参考例

static

void Method(

ref int i) {

i = 44;

}

static void

Main()

{

int val = 0;

メソッド(ref val);

// val は 44 になりました

} }

ref パラメータに渡されるパラメータは、最初に初期化する必要があります。これは、パラメータを渡す前に明示的に初期化する必要がない out とは異なります。

ref と out は実行時には異なる方法で処理されますが、コンパイル時には同じように扱われます。したがって、1 つのメソッドが ref パラメーターを受け取り、別のメソッドが out パラメーターを受け取る場合、両方のメソッドをオーバーロードすることはできません。たとえば、次のコードの 2 つのメソッドはコンパイルの観点からは同一であるため、次のコードはコンパイルされません:

1

2

3434
5

6

###7###

クラス

CS0663_Example

{

// コンパイラ エラー CS0663: "オーバーロードされた を定義できません

// ref と out でのみ異なるメソッド".

public

void SampleMethod(ref

int i) { } public void SampleMethod(out

int i) { } } # ただし、あるメソッドが ref または out パラメーターを受け取り、別のメソッドがこれら 2 つのパラメーターを受け取らない場合、次の例に示すようにオーバーロードされる可能性があります。

#1 2

5

out パラメーターとして渡される変数は、渡す前に初期化する必要はありませんが、メソッドが戻る前に値を割り当てることができるように、メソッドを呼び出す必要があります。
クラス

RefOutOverloadExample

{

public

void SampleMethod(

int

i) { }

public void SampleMethod(ref int

i) { }

}<p><strong>out (C# リファレンス) </strong></p> <p>out キーワードを使用すると、パラメーターが参照によって渡されます。これは ref キーワードと似ていますが、ref では変数を渡す前に初期化する必要がある点が異なります。 out パラメーターを使用するには、メソッド定義とメソッド呼び出しの両方で明示的に out キーワードを使用する必要があります。 </p> <table border="0"> <tbody><tr class="firstRow"> <td> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> ###7### <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> <p>13</p> <p>14</p> <p> </p> </td> <td>クラス<p> <code>OutExample

{

static void Method(out int i)

{

i = 44;

}

static void Main()

{

int value;

メソッド(out 値);

// 値は 44 になりました

}

}

ref キーワードと out キーワードは、実行時には異なる方法で処理されますが、コンパイル時には同じ方法で処理されます。したがって、1 つのメソッドが ref パラメーターを受け取り、別のメソッドが out パラメーターを受け取る場合、両方のメソッドをオーバーロードすることはできません。たとえば、次のコードの 2 つのメソッドはコンパイルの観点からは同一であるため、次のコードはコンパイルされません:

1 ただし、1 つのメソッドが ref または out パラメータを受け取り、別のメソッドがこれら 2 種類のパラメータを受け取らない場合は、次のようにオーバーロードできます。

2

3

4

5

6

###7###

クラス
CS0663_Example

{

// コンパイラ エラー CS0663: 「オーバーロードされた

を定義できません」

// ref と out でのみ異なるメソッド".

public

void SampleMethod(out int i) { }

public

void SampleMethod(ref int i) { } }

12

3

4

5

クラス
RefOutOverloadExample

{

public

void SampleMethod(int i) { }

public

void SampleMethod(out int i) { } }

以下は私の経験に基づいてまとめたものです:

違い

ref と out の違い C# では、パラメーターは値またはによって渡すことができます。参照 。パラメーターを参照渡しすると、関数メンバーがパラメーターの値を変更し、その変更を保持できるようになります。パラメータを参照によって渡すには、ref または out キーワードを使用します。 ref キーワードと out キーワードはどちらも同様の関数を提供し、C のポインター変数とよく似た機能を提供します。両者の違いは次のとおりです:

1. ref 型パラメータを使用する場合、渡されるパラメータを最初に初期化する必要があります。 out の場合は、メソッド内で初期化する必要があります。

2. ref と out を使用する場合、メソッドのパラメータとメソッドの実行時に Ref または Out キーワードを追加する必要があります。試合を満足させるために。

3. Out は、retrun が複数の戻り値を必要とする場合の使用に適しており、ref は、呼び出されたメソッドが呼び出し元の参照を変更する必要がある場合に使用されます。

メソッド パラメーターの out メソッド パラメーター キーワードにより、メソッド参照がメソッドの同じ変数に渡されます。メソッド内のパラメータに加えられた変更は、制御が呼び出し側メソッドに戻されるときにこの変数に反映されます。

out メソッドの宣言は、メソッドが複数の値を返すようにする場合に便利です。 out パラメーターを使用するメソッドは引き続き値を返すことができます。メソッドには複数の out パラメーターを含めることができます。

out パラメーターを使用するには、パラメーターを out パラメーターとしてメソッドに明示的に渡す必要があります。 out パラメータの値は out パラメータに渡されません。

出力パラメータとして渡される変数は初期化する必要はありません。ただし、メソッドが戻る前に、out パラメータに値を割り当てる必要があります。

プロパティは変数ではないため、出力パラメータとして渡すことはできません。

つまり、これを一文にまとめると、ref は入ることと出ることの両方を意味し、out は出るだけで入ってこないことを意味します。

関連記事:

[c# チュートリアル] C# のデータ型

静的ローカルで C、C、C# を見てみる変数、Java、PHP の機能

以上がC# の out と ref についてどう思いますか?それらの違いを調べてくださいの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート