音ゲー、fps、DTM、プログラミング雑記置き場

ブログタイトル通りに雑記を垂れ流す。

【C#】C#ショートハンドまとめ

  • ちょっとしたことをまとめたやつ(ショートハンドじゃなくて基本的な構文とか載ってるけどきにしない)
  • C#に限った話でないけど暗黙的な省略とか糖衣構文ゴリゴリつかったスマートなコードは検索かけづらい!!つらい!

メソッドの宣言

  • アクセス修飾子
    • private:何もかかないとこちらが設定される。同じクラス(もしくは元にした生成インスタンス)内からの参照しか許容しない
    • public:別アセンブリ(=プロジェクト)からでも参照可能。
      • 基本はprivateで実装に影響がある場合、publicの変更を検討するのが安全?
// アクセス修飾子、返り値型、メソッド名(引数)
public int getSum(int arg1,int arg2);
// 呼び出し元で引数を設定していない場合の初期値をセットするパターン
public int getSum(int arg1 = 0,int arg2 = 0);

オブジェクト(参照型)を文字列として扱う

  • 下記はコントロールラベルに文字を出力するソース
// ×:キャスト演算子がこの変換をサポートしておらず実行エラーになる
formLabel.text = (string)arr[i];
// △:arr[i]が参照型だったら実行エラーにはならない
// 連想配列でarr[i+1]に値型が入っていたら?
formLabel.text = arr[i] as String;
// ◎:オブジェクト型のクラスに用意されているメソッドで文字列変換してるため
// arr[i]の中身のデータ型に依存しないため上記例の中で一番安全
formLabel.text = arr[i].toString();

静的クラスメンバ

public static int a

Visual Studioで任意範囲のソースを折りたためる用にする

//#region以降は任意の文字列を設定可能 
#region publicMethod

#endregion

varによる動的型変換

  • 初見ソース読んでJSかと思って二度見した
//aはint型でコンパイルされる
var a = 1;

baseキーワードによる基底クラスのメンバ参照

  • baseキーワードで基底クラスを呼ぶことにより実装者はMusicクラスの内部を意識せず開発ができる
    オブジェクト指向で隠ぺい化、秘匿性と言われるやつ
public class Musuic
{
    protected string title {get; set;};
    protected string artist {get; set;};
    public virtual void GetSong()
    {
        Console.WriteLine(title + "/" + artist);
    }
}

//派生クラス
public class DanceMusic : Music
{
    public string genre {get; set;};
    public override void GetSong()
    {
        //ここで呼ばれるのはMusic(基底)クラス
        base.GetSong();
        Console.WriteLine(genre);
    }
}

class MusicOutput
{
    static void main()
    {
        DanceMusic edm = new DanceMusic();
        edm.title = "Your My Angel";
        edm.artist = "Darren Styles";
        edm.genre = "UK Hardcore";
        //ここで呼ばれるのはDanceMusic(派生)クラス
        edm.GetSong();
    }
}
  • 出力イメージ
Your My Angel / Darren Styles
UK Hardcore

StringBuilderクラスによる文字列操作の高速化

  • stringクラスは宣言後、値の変更が認められず再代入を行おうとすると新しくオブジェクトが生成される

    • そのため文字数分だけ効率よく動的にメモリを確保するStringBuilderクラスを用いた方がパフォーマンスは向上する
      • MicroSoftでもStringBuilserクラスでの文字列操作を推奨している
    • 上記はループ内や長いSQLクエリの文字列を作成する際などで特に用いられる
    • StringクラスはCharの2Byte配列のため結合するとサロゲートペアとかで挙動が担保できないから値の変更を許容してない(あくまで推測)
  • 以下MicroSoft Learnのリンク

不変性と StringBuilder クラス

NULL条件演算子.?でNULL参照エラー回避

  • 上記演算子が検索かけにくい件
  • a.?b の場合、aがNULLならこの式全体はNULLを返す。aがNULL以外ならbの結果を返す。
    • 上記条件式でaがNULLの場合でもbメソッドを実行させたい場合にこの演算子を用いる
    • この演算子がないとa時点でNULL参照エラー(ぬるぽ)してbが実施されずExceptionに飛ばされる
      • aがNULLを返す可能性がある場合は上記実装を視野に入れる
        • e.g.) レコード取得結果(0件)、フラグ値のチェック etc..

ラムダ式による匿名関数

  • 下記のようなメソッドを省略してかける
public int Add(int x, int y)
{
    int sum;
    sum = x + y;
    return sum;
}

//ラムダ式による匿名関数
//左辺:引数情報(()内は省略可)、メソッドの処理内容
(x , y) => {
    int sum;
    sum = x + y;
    return sum;
};

//ふつうは変数sum使わず下記のように記載する
(x , y) => {x + y;};
  • もう少し実用的なことに掘り下げると、右辺のメソッド処理がデリゲードとして扱われ
    Actionオブジェクトに代入される(Actionクラスに処理がカプセル化、秘匿される)