C#を薦めてみる

# WEB系、アプリ系でC#を使っている会社は少ない？

---------------------

# 使っている企業とか

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64362/1c7d784f-9f68-b1ba-6076-2f2e34cc143b.png)

---------------------

# そもそもC#って

### Microsoft製

### 型がある

### オブジェクト指向

継承があったりインターフェースがあったり抽象クラスがあったり

```cs
public class Child : Parent
{
    private readonly string str;

    private readonly int num;

    public Child(string str, int num)
    {
        this.str = str;
        this.num = num;
    }

    public string GetContent()
    {
        return $"str = {str}, num = {num}";
    }
}

var child = new Child("test", 1);
child.GetContent();
// str = test, num = 1
```

---------------------

# C#のいいと思う機能

---------------------

# 型推論

```cs
// int型に
var num = 1;

// List<string>型に
var strList = new List<string>() { };
```

---------------------

# getter, setter, メンバ

```cs
public class People
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName
    {
        get => $"{FirstName}{LastName}";
    }
}


var people = new People();
people.FirstName = "Taro";
people.LastName = "Tanaka";
Console.WriteLine(people.FullName);
```

プロパティごとにアクセス修飾子を変えることもできる

```cs
public int Age
{
    get;
    private set;
}
```

readonlyというものも

```cs
public class People
{
    private readonly DateTime birthday;

    public People(DateTime birthday)
    {
        this.birthday = birthday;
    }
}
```
インスタンスフィールドであればコンストラクタ内でのみ割り当て可能

---------------------

# 初期化

## オブジェクト初期化子

```cs
public class People
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public People() { }
}

var people = new People()
{
    FirstName = "Taro",
    LastName = "Tanaka"
};

```

## 名前付き引数

```cs
public class People
{
    public People(int age, DateTime birthday)
    {
        // 処理
    }
}

var people = new People(age: 5, birthday: DateTime.Now);

```


---------------------

# async await
単数のタスク

```cs
public async Task<string> GetSingleAsync()
{
    var result = await GetStringAsync();
    return $"結果={result}";
}

private Task<string> GetStringAsync()
{
    var task = Task<string>.Run(() =>
    {
        // 何か重い処理
        return "async!";
    });
    return task;
}

var single = new SampleAsync().GetSingleAsync().Result;
```

複数のタスク

```cs
public async Task<string> GetMultiAsync()
{
    var task1 = GetStringAsync();
    var task2 = GetStringAsync();
    var task3 = GetStringAsync();
    var task4 = GetIntAsync();

    var results = await Task.WhenAll(task1, task2, task3);

    return string.Join(",", results);
}

var multi = new SampleAsync().GetMultiAsync().Result;
```

---------------------

# LINQ
コレクションを便利に扱える拡張メソッド

```cs
var arr = new string[] { "a", "bb", "ccc" };

// 含んでいるか
arr.Any(s => s == "a");
// True

// 絞り込み
arr.Where(s => s.Length >= 2);
// IEnumerable<string> { "bb", "ccc" }

// 射影
arr.Select(s => s + s);
// IEnumerable<string> { "aa", "bbbb", "cccccc" }
```

IEnumerableな値が返されるためメソッドチェーンで書くことが可能

```cs
arr.Where(s => s.Length >= 2)
    .Select(s => s + s)
    .ToArray();
```

---------------------

# 他にも
- 拡張メソッド
- ジェネリクス
- 属性定義、Attribute
- null条件演算子
- 例外フィルター
- タプル、分解

---------------------

# マルチプラットフォームに
すでにWindowsだけのものではない
MacやUbuntuでだって開発できる


---------------------

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64362/aa2377c2-915c-1459-f059-bc9781f4e514.png)
（引用元：[Microsoft really does love Linux](https://www.theverge.com/2016/9/15/12926288/microsoft-really-does-love-linux)）

---------------------

![GitHub買収.png](https://qiita-image-store.s3.amazonaws.com/0/64362/e2ee0e00-41ce-6bc0-031d-1ccd5ca50db8.png)
（引用元：[Microsoft、GitHubを75億ドルで買収へ](https://jp.techcrunch.com/2018/06/05/2018-06-04-microsoft-promises-to-keep-github-independent-and-open/))