まえがき
このレポートは「独習C#」で学んだ内容をSkype勉強会での活動日誌として、「書面としてアウトプットする」こと、「電気系の学生の成果物を作るための意識高い系(笑)のレポート」です。完全初心者なので、勉強会参加者の先輩たちから様々なツッコミを頂きながら書いております。それゆえに先輩たちの目から外れた誤字脱字等ございますが、ぜひともツッコミいただいて、私の勉強にさせていただければと思います。就活終わったので、そろそろ蛍の光でも流そうかと思います。
スタートライン
戻り値の参照渡し
C#の戻り値を呼び出し元に参照渡しすることも可能です。参照渡しされた配列要素を更新する例です。まずは、戻り値を参照渡しする流れを抑えてみましょう。
using System;
namespace returnref
{
class Passreturn{
public ref int Returnref(int [] data){
return ref data[0];
}
}
class Program
{
static void Main(string[] args)
{
var data = new [] { 1, 2, 3};
var p = new Passreturn();
ref int num = ref p.Returnref(data);//refをポインタモードとしてみれば、答えの解釈としてわかりやすかった。
// アドレスのコピーとして考えることができる。そしてそれを参照しているという解釈?
num = 10;
Console.WriteLine(num);//Main関数のnumを参照しているため
Console.WriteLine(data[0]);//アドレスが更新されたため。
}
}
}
ref int num = ref p.Returnref(data);
が、
int num = p.Returnref(data);にしてもコンパイルエラーにならずに実行されます。
ただし、値として、予期しない動作をする可能性が高くなります。注意しましょう。
-------------------------------------------------------------------
You may only use the Microsoft .NET Core Debugger (vsdbg) with
Visual Studio Code, Visual Studio or Visual Studio for Mac software
to help you develop and test your applications.
-------------------------------------------------------------------
10
1
次に本来の動きがどういう意図で動いているのか確認してみましょう。
最初は、data[0]のアドレスがコピーされ、値がコピーされる。しかし、ここでの違いは、そのアドレスがひも付けとしてそのまま保持されている。ポインタモードと考えが同じ考えで考えると、numにdata[0]のアドレスと値が連携していると考えると、わかりやすい。
(shiracamusさん!ご指摘ありがとうございました!変更させていただきました 2018.07.09,09:13)
-------------------------------------------------------------------
You may only use the Microsoft .NET Core Debugger (vsdbg) with
Visual Studio Code, Visual Studio or Visual Studio for Mac software
to help you develop and test your applications.
-------------------------------------------------------------------
10
10
といった風に戻り値も参照渡しで値を取り出すことが可能です。これを応用するには、また時間がかかりそうですね・・・!
あとがき
ということで、最近Javaも書き始めて、C#の理解がより深まったようなそんな感じです。
C#は「人を育てる言語なんだなぁ」と改めて感じてしまう、そんな会でした。
C言語のポインタの解釈が間違っているかもしれません・・・
個人的な解釈だけでは、おそらくよろしくないと思うので、ご指摘あればまたよろしくお願いします・・・!