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

目次

概要

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

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

詳細

パラダイム

マルチパラダイム

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

型付け

  • 強い静的型付け

他の言語との関係

影響を受けた言語

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

ref変数

クラス定義

部分型

開発ツールなどが裏で使用していることが多い。

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戻り値

名前付き引数

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

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」代替なので、

上記のように「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";
}

演算子

nameof

条件分岐

as, is式と拡張

switch文と拡張

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-09-18 (火) 15:04:43 (2d)