お疲れ様です。たなしょです。
今日はメモリ管理周りとジェネリクスのことを学びました。
C/C++で学んだことがあるのでそこまで書くことが目新しいものはありませんでした。
スタック、ヒープ
スタックはLIFOで、ヒープはスタックと違ってデータの持ち方が整頓されていないイメージです。
この辺もこのくらいの知識で問題ないかなと思ってサクッと読みました。
構造体
C/C++やGoでもよく使っていてある程度使い方を分かってるので記載は割愛します。
でもclassとstructの違いは参照型と値型で違うから、
classを宣言して値を変えてしまうと全体に影響するが、stuructの場合は影響範囲は限定できます。
値渡し、参照渡し
C#で参照渡しする場合、ref
を付けることで参照渡しと判定されるそうです。
static void Test(ref int a)
{
a = 10;
}
out修飾子
out修飾子を使うとメソッド内で変数を初期化することができるようになります。
class Sample
{
static void Main()
{
int a;
Test(out a);
Console.WriteLine("{0}\n", a);
}
static void Test(out int a)
{
a = 10;
}
}
リソースの破棄、using
ファイルをopenしたら必ずcloseしましょうねという内容でした。なのでfinallyをつって必ずcloseさせるか、
usingステートメントを使うことで処理が終了したら自動的にリソースを破棄するように処理することができます。
Goはdefer
がリソースの破棄の際に使われますね。あれは便利ですね。
ジェネリクス
あまり知らなったのですが型を指定しなくてもclassを宣言できるのは便利だなと思いました。
ただチーム開発になってジェネリクスのclassが乱立してたらちょっと読みづらそうだなとおもいました。
確かに余分なclassを書かなくていいので便利そうではありますよね。
using System;
class IntStringPair
{
public int Key { get; set; }
public string Value { get; set; }
public IntStringPair(int key, string value)
{
this.Key = key;
this.Value = value;
}
}
class IntIntPair
{
public int Key { get; set; }
public int Value { get; set; }
public IntIntPair(int key, int value)
{
this.Key=key;
this.Value=value;
}
}
class KeyValuePair<TKey, TValue>
{
public TKey Key { get; set; }
public TValue Value { get; set; }
public KeyValuePair(TKey key, TValue value)
{
this.Key = key;
this.Value = value;
}
}
class Sample
{
static void Main()
{
/*var studentName = new IntStringPair(1, "test");
var studentAge = new IntIntPair(1, 28);*/
var studentNameT = new KeyValuePair<int, string>(1, "test2");
var studentValueT = new KeyValuePair<int, int>(1, 11);
Console.WriteLine(studentNameT.Value);
Console.WriteLine(studentValueT.Value);
}
}
最後に
今読んでいる本もあと少しで読了できそうです。
明日はC#の目玉機能の一つと言われているLINQを勉強します。