マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

2000年から開発が始まったマイクロソフト(アンダース・ヘルスバーグ率いるチーム)が設計・開発したプログラミング言語。

  • 構文はC言語や、C言語風に構文が設計されたC++やJavaなどの影響がある。
  • 構文以外についてはヘルスバーグが以前の所属であるBorlandで設計したDelphiからの影響がある。
  • 標準化機構に託して自由な利用を許す(ECMA-334、ISO/IEC 23270:2003、JIS X 3015)など、姿勢の変化がある。

詳細

パラダイム

マルチパラダイム

  • 構造化, 命令型、宣言型、手続き型
  • イベント駆動型, オブジェクト指向
  • ジェネリック
  • リフレクション
  • 関数型, 並行計算

型付け

強い静的型付け

マネージ型・アンマネージ型

  • マネージ型
    • System::Object クラスから派生する型
    • ガベージ・コレクタの管理下に置かれる。
    • Equals、GetHashCode?ToString?などの基本メソッドを実装する。
  • アンマネージ型
    • 組み込み型
    • ポインタ型
    • 列挙型
    • 構造体(参照型のフィールド・プロパティを含まない)

他の言語との関係

影響を受けた言語

C++, Delphi, Eiffel, Java, LISP

影響を与えた言語

D言語, F#, Java, Nemerle, Vala

その他

プラットフォーム

Windows, macOS, Linuxなど

ライセンス

Apacheライセンス (Roslyn)

スニペット

忘れ易いスニペット置き場が欲しかったので。

変数定義

var

型推論を利用したローカル変数の宣言。
一時的に使用される型を簡単に定義する。

var her = new { Name = "Jane Doe", Age = 20 }
var him = new { Name = "John Doe", Age = 20 }

dynamic

  • Dynamic Language Runtime(DLR)追加によりサポートされ、
    オブジェクトに対する操作のバインドは実行時まで遅延される。
  • Reflectionやスクリプト言語との連携が容易になる。

ref変数

値型を参照型として扱う。

// ref戻り値をref変数で受け取る
ref int max = ref Max(ref x, ref y);
// limitとmaxは同じ値を参照する
ref int limit = ref max;

クラス定義

部分型

開発ツールなどが裏で使用していることが多い。
(ユーザー・コーディング部分と、designer生成部分)

class MyClass { int a; int b; }

↓↓↓

partial class MyClass { int a; }
partial class MyClass { int b; }

プロパティ

自動実装プロパティ

メンバ変数+プロパティ・プロシージャの略記が可能。

private int __value;
public int Value
{
  get { return __value; }
  private set { __value = value; }
}

↓↓↓

public int Value { get; private set; }

メソッド定義

オプション引数

public int MethodB(int A = 0, int B = 0, int C = 0)
{
  return A + B + C;
}

ref戻り値

ref変数で受け取る場合、
ref戻り値として返すなどする。

名前付き引数

上記のオプション引数を選択的に指定できる。

public void MethodA()
{
  // 第1引数と第2引数を指定、第3引数は未指定:
  Console.WriteLine("Ans: " + MethodB(1, 2));  // Ans: 3 … 1 + 2 + 0となっている

  // 第1引数と第3引数を指定、第2引数は未指定:
  Console.WriteLine("Ans: " + MethodB(A: 1, C: 3));  // Ans: 4 … 1 + 0 + 3となっている
}

ジェネリック

クラスでも使用可能。STLっぽく書く(コンセプトは違うっポイ)。

匿名デリゲート

ラムダ式

匿名デリゲートに次ぐ「delegate」の拡張。

  • C# 今更ですが、ラムダ式
    https://qiita.com/rawr/items/11790e9ea08a29d028a4
    • 定義側
      public IEnumerable<string> Read(string path, Func<string, string> fx)
      {
        var result = new List<string>();
        using (var reader = new StreamReader(path))
        {
          while (reader.Peek() >= 0)
          {
            var line = reader.ReadLine();
            result.Add(fx(line));
          }
        }
        return result;
      }
  • 呼出し側
    XXXX.Read("hoge.txt", s => s + ".txt");

上記のように「Action、Funcのデリゲートの型」を使用する。

拡張メソッド

  • 継承せずにインスタンス・メソッドを追加定義。
  • 列挙型やインターフェイスにも適用可能。
  • 拡張メソッド定義側の名前空間をインポートしないと発見できないのがアレ
  • 定義
    第一引数のthisに当該インスタンス・メソッドを追加。
    public static class StringUtil
    {
      public static string Repeat(this string str, int count)
      {
        var array = new string[count];
        for (var i = 0; i < count; ++i) array[i] = str;
        return string.Concat(array);
      }
    }
  • 利用
    以下の、どちらの例も "foofoofoofoo" を返す。
    // 静的メソッドとしての呼び出し
    StringUtil.Repeat("foo", 4);
    // 拡張メソッド(インスタンス・メソッド)としての呼び出し
    "foo".Repeat(4);

非同期処理

初期化

配列

  • 配列
    int[] array1 = new int[] { 1, 3, 5, 7, 9 };
  • List
    List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
  • Dictionary
    Dictionary<string, string> openWith
       = new Dictionary<string, string>()
    {
      {"txt", "notepad.exe"},
      {"bmp", "paint.exe"},
      {"dib", "paint.exe"},
      {"rtf", "wordpad.exe"}
    };
  • 匿名型の配列
    型を省略できる(何らかの型に解釈されるが、object型での解釈はされずコンパイル・エラーになる)
    var a = new[] {"foo", "bar", null};

オブジェクト

  • memberの初期化
    Point p = new Point{ X = 0, Y = 1 };
  • memberのnew
    var x = new Line
    {
     A = { X = 1, Y = 2 },
     B = { X = 3, Y = 4 },
    };
  • var(anonymous type)
    // anon is compiled as an anonymous type
    var anon = new { Name = "Terry", Age = 34 };

自動実装プロパティ

C#6から自動実装プロパティの初期化が可能。

class Class1
{
    public string Auth { get; set; } = "BlahBlah";
}

演算子

typeof

  • System.Type型情報を取得する。
System.Type type = typeof(int);  
  • .GetType?()メソッドと同じ。
    int i = 0;  
    System.Type type = i.GetType();  

sizeof

  • アンマネージ型のサイズを(バイト単位、int型で)取得。
  • C# 2.0以降は「組み込み型」に対するsizeofに関してのみunsafeが不要
  • Marshall.SizeOf? メソッドとは違うので注意(こちらはインスタンスのサイズ)。

nameof

  • 変装や、クラス、メソッド、プロパティなどの名前(識別子)を文字列リテラルとして取得
  • 名前空間やクラス名などで修飾されていない名前(必要ならReflectionで取得可能)

as, is式と拡張

  • is式
    • オブジェクトに指定された型との互換性がある場合、trueと評価される。
    • (拡張)後続に変数を宣言し、trueと評価された場合、変数にキャストした値を代入する。
  • as式
    • 互換性のある参照型または null 許容型間で特定の型変換を実行する。
    • 非互換の場合は、例外ではなく、nullを返す。
    • 以下の2つのコードは等価
      expression as type;
      expression is type ? (type)expression : (type)null;

条件分岐

switch文と拡張

C#では、break;を明記するものの、フォールスルーを禁止されている。

  • 定数パターン
    switch(変数)
    {
      case 値1:
        いくつかの文1 // 変数の値 == 値1 のとき実行される
        break;
      case 値2:
        いくつかの文2 // 変数の値 == 値2 のとき実行される
        break;
          ・
          ・
          ・
      default:
        いくつかの文 // 変数の値がどの値とも異なるとき実行される
        break;
    }
  • 型パターンとwhen句
    void Decide(object obj) {
        switch (obj) {
            case int num when num < 0:
                Console.WriteLine($"{num}は負の数です。");
                break;
            case int num:
                Console.WriteLine($"{num}を二乗すると{num * num}です。");
                break;
            case "B":
                Console.WriteLine($"これはBです。");
                break;
            case string str when str.StartsWith("H"):
                Console.WriteLine($"{str}はHから始まる文字列です。");
                break;
            case string str:
                Console.WriteLine($"{str}は文字列です。");
                break;
            case null:
                Console.WriteLine($"nullです");
                break;
            default:
                Console.WriteLine("判別できませんでした");
                break;
        }
    }

三項演算子

以下の例で、始めにaを評価してその評価値が、

  • 真である時はbを評価してその評価値を返し、
  • 偽である時はcを評価してその評価値を返す。
    int x = a ? b : c;

null結合演算子

  • nullでない最初の値を返す。
    object obj1 = null;
    object obj2 = new object();
    object obj3 = new object();
    return obj1 ?? obj2 ?? obj3; // obj2 を返す
  • Nullable型を非Nullable型に代入するときに便利
    int? i = null;
    int j = i ?? -1; // nullをint型に代入することはできない

参考

LINQ

ラムダ式って

拡張メソッド


Tags: :.NET開発, :プログラミング


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-10-23 (火) 13:30:12 (29d)