独習C 新版のレビュー記事です。本の分量自体が索引含め606ページととても読み応えのあるものだったため、読んだ感想(ざっくり)からだんだん詳細が伝わるように書いていこうと思います。

全部読み、各章についているの理解を確認するための問題も一通り考えてみました。

こういう人が読むといいかも

普段業務や趣味でC#である程度意図通り動作するアプリケーションを書いているが…

  • 人のコードを読んでいて構文的にわからないことがある
  • 動くけどなんでそれが構文的に正しいかよくわかってないなぁと思うことがある
  • いつも手に馴染んだ書き方で書いているが、他にも書き方ありそうなので打ち手を増やしたい
  • C#を体系的に勉強したいけどなにを「体系的」とするか一例を見てみたい

書いたことがあるけど、動いている部分を説明できるように「基礎」を勉強し直したいときに読むとよさそうです。

僕自身が読むにあたっては理解や知識に漏れがる部分がどんどん埋まっていく感じがしました。

こんな人が読むのは厳しいかも・向いてないかも・書いてないかも

  • デスクトップアプリ、モバイルアプリ、Webアプリケーションのフレームワークの使い方が知りたい
  • Visual Studioを使いこなしたい
  • はじめてC#を書くにあたってC#の概要を知りたい

はじめてC#に触れる人がこの本を読むのはちょっとしんどいと思いました。

C#経験が少ない人のことも意識されてますが、網羅的かつ詳細に説明されているだけに、どれも大事なことのように思えて読み終わらなさそうです。優先度の甲乙がつけがたい。

レビューを書く人(自分)のC#歴

C#との接点

  • 2015年夏くらいから業務でWPFのアプリ開発を半稼働くらいで開始
  • 2016年は半分と少しくらいWPFアプリ開発に従事
  • 2017年は7割くらいXamarin(Macアプリと趣味でモバイルアプリ)とWPFとAWS LambdaでC#を触る

読んだ本

  • Xamarin本一通り

あとC#本何冊か部分部分読みました。

特徴的なところ・いいなと思ったところ

似た使い方をする構文の違いの説明が詳しい

  • ジャグ配列と多次元配列のLengthの違い
  • ==Equalsの違い
  • &&&の違い
  • Regexのインスタンスメソッドとクラスメソッドの違い
  • readonlyconstの違い
  • File/DirectoryFileInfo/DirectoryInfoの違い
  • 値型の値渡し、参照型の値渡し、値型の参照渡し、参照型の参照渡しの違い
  • ListLinkedListの使い分け
  • LINQのクエリ構文とメソッド構文の違い
  • 匿名型とタプルの用途の違い
  • interfaceと抽象クラスの使い分け
  • DynamicObjectExpandoObjectの使い分け

本文中で説明されているものもあれば、「エキスパートに訊く」という特設コーナーでQA形式で説明されているものもあってとても勉強になりました。

使っているはずだけど知らなかったことが振り返れる

  • ifwhiledo while{...}省略時の意図していないはずの挙動
  • フィールドの初期化子、コンストラクター、オブジェクトの初期化子の初期化の順番
  • C#6からラムダ式で書けるようになったメンバーの一覧
  • Spritメソッドでseparatorなしの場合はIsNullOrWhiteSpace相当区切り
  • 正規表現で最長一致・最短一致させるための書き方
  • Stackforeachで取り出すときも後ろから取り出す
  • 構造体使用が妥当なケース
  • ハッシュテーブルへのアクセス効率

自明なものとして表立って説明されることはなかったり省かれたりすることが多いけど概念的に大事なことを一言で言い表した上でC#の実装や図表と合わせて説明されている

  • サロゲートペア
  • バッファー
  • コレクション
  • スタック
  • キュー
  • セット
  • ディクショナリ、マップ、ハッシュ、連想配列
  • ジェネリック
  • アセンブリ
  • ストリーム
  • シグニチャ
  • スレッド
  • プロセス

ラムダ式登場の経緯

デリゲート型にをより簡素に書くためにラムダ式が登場した背景が具体的なコードと共に説明された上で、ラムダ式をよく使うLINQの説明がなされていてとても頭に入ってきやすかったです。

この部分に限らず、全体的に単に使い方だけでなく構文登場の背景や、以前のC#バージョンではこう書いていたが今はこう書けるので今後はこう書いていくべきのようにC#をとりまく歴史の中で説明されているので頭がスッキリしました。

全然知らなかった、考えてみたこともなかった…

  • volatile
  • 属性や動的オブジェクト(DynamicObject派生クラス)を自分で定義して使う
  • .NET FrameworkでPythonを動作させる(IronPython
  • マルチキャストデリゲート
  • 演算子のオーバーロード

章毎の確認問題

章毎に理解度を確認するための問題がついています。

コードを書く以外の問題(◯×問題)を掲載するので、試しに確認してみてください。答えが気になる方は是非本でどうぞ!

※章途中の小問題もけっこうあるのでここに掲載する倍以上の問題とその解説が載っています。

  • 1章
    • C#の特徴を「マルチパラダイム」「マルチプラットフォーム」というキーワードを絡めて説明してみましょう。
    • C#アプリは、どのメソッドから実行されますか。また、そのようなメソッドのことをなんと呼ぶでしょうか。
    • 文の末尾を示す記号を答えてください。
    • C#で使えるコメントの記法をくべて挙げてください。また、これらのコメントの違いを説明してください。
  • 2章
    • 次の文章は、C#の基本構文について述べたものです。正しいものには◯、間違っているものには×を記入してください。
    • ( )小数点型は、符号なし型と符合あり型とに分類できる。
    • ( )文字列リテラルはダブルクオート、またはシングルクオートでくくる。
    • ( )short型の型サフィックスは「〜s」である
    • ( )暗黙的な型変換は常に安全なので、桁落ちなどの情報欠落は発生しない
    • ( )メソッド/フィールドなどにアクセスするには、必ずnew演算子でクラスをインスタンス化しなければならない。
  • 3章
    • (省略)
  • 4章
    • (省略)
  • 5章
    • (省略)
  • 6章
    • この文章は、コレクションについて説明したものです。正しいものには◯、誤っているものには×を付けてください。
    • ( )Listへの挿入/削除は、位置に関わらずほぼ一定のスピードで可能です。
    • ( )LinkedListへの挿入/削除では要素前後のリンクの付け替えが発生するので、比較的低速である。
    • ( )HashSetは要素の重複を許さず、一意の値を決められた順序で保持します。
    • ( )Dictionaryは一意のキーと値のペアでデータを管理します。キーの並び順は保証されません。
    • ( )Stackは先入れ先出し、Queueは後入れ先出しと呼ばれるデータ構造です。
  • 7章
    • 以下はオブジェクト指向の主要なキーワードについて説明したものです。正しいものには◯、誤っているものには×を付けてください。
    • ( )フィールド/メソッドは外部から呼び出すことが前提の仕組みなので、アクセス修飾子も既定はpublicである。
    • ( )readonlyフィールドとローカル変数の名前は重複してはならない
    • ( )forループで宣言されたカウンター変数は登場以降、そのメソッドの内部であればアクセス可能である。
    • ( )匿名型はその場限りであれば、引数や戻り値の型として利用することが可能である。
  • 8章
    • 以下の文章はオブジェクト指向構文について説明したものです。正しいものには◯、誤っているものには×を付けてください。
    • ( )派生クラスから基底クラスのコンストラクターを呼び出すには、superキーワードを利用する。
    • ( )virtual修飾子のないメソッドを、派生クラスで再定義することはできない。
    • ( )override修飾子のないメソッドに、sealed修飾子を付けることはできない。
    • ( )as演算子は左オペランドが右オペランドの方に変換できる場合にtrueを返す。
    • ( )インターフェイスを複数実装することはできるが、クラスと一緒に実装/継承することはできない。
  • 9章
    • 以下の文章は本章で学んだ機能について説明したものです。正しいものには◯、誤っているものには×を付けてください。
    • ( )catchブロックは、ブロックで指定された例外と発生した例外とが一致した場合にだけ実行される。
    • ( )クラス/インターフェイス/構造体は、互いに入れ子の関係になることが可能である
    • ( )構造体では、継承は可能だが、インターフェイスの実装はできない。
    • ( )列挙定数の型は、任意の数値型から選択できる。
    • ( )演算子のオーバーライドという機能を利用することで、「+」「-」「==」のような演算子をクラス独自に再定義できる。
  • 10章
    • 以下の文章は、デリゲート/ラムダ式/LINQについて述べたものです。正しいものには◯、誤っているものには×を付けてください。
    • ( )引数にメソッドを引き渡すような用途では、ラムダ式よりも匿名メソッドを利用すべきである。
    • ( )ラムダ式で引数がない場合には、「=>式」のように引数そのものを省略できる。
    • ( )LINQのクエリ構文は、メソッド構文でできることであれば必ず表現できる。
    • ( )LINQでは、与えられたデータソースによってプロバイダーを決定するので、アプリ開発者がプロバイダーを意識する必要はない。
    • ( )LINQのクエリ構文は必ずselect句で終了しなければならない。
  • 11章
    • 以下の文章は本章で解説したテーマニついて説明したものです。正しいものには◯、誤っているものには×を付けてください。
    • ( )スレッドを維持しておくのはリソースの浪費なので、できるだけその場その場で解放するのが望ましい。
    • ( )await演算子は、指定された非同期処理の終了を待ってメインスレッドを待機させる。
    • ( )属性によって適用できる要素は決まっている。
    • ( )dynamic型では、存在しないメンバーを呼び出してもエラーにはならない。
    • ( )イベントを登録するには、「=」演算子を利用する。

目次

意外とネットに転がってない…

  • 1章 イントロダクション
    • 1.1 C#の特徴
    • 1.2 C#アプリを開発/実行するための基本環境
    • 1.3 C#プログラミングの基本
  • 2章 C#の基本
    • 2.1 変数
    • 2.2 データ型
    • 2.3 リテラル
    • 2.4 型変換
    • 2.5 参照型
  • 3章 演算子
    • 3.1 算術演算子
    • 3.2 代入演算子
    • 3.3 関係演算子
    • 3.4 論理演算子
    • 3.5 ビット演算子
    • 3.6 その他の演算子
    • 3.7 演算子の優先順位と結合則
  • 4章 制御構文
    • 4.1 条件分岐
    • 4.2 繰り返し処理
    • 4.3 ループの制御
    • 4.4 制御命令のその他の話題
  • 5章 標準ライブラリ
    • 5.1 文字列の操作
    • 5.2 正規表現
    • 5.3 日付/時刻
    • 5.4 ファイル操作
    • 5.5 その他の機能
  • 6章 コレクション
    • 6.1 コレクションAPIの基本
    • 6.2 リスト
    • 6.3 セット
    • 6.4 ディクショナリ
  • 7章 オブジェクト指向構文(基本)
    • 7.1 クラス定義
    • 7.2 フィールド
    • 7.3 メソッド
    • 7.4 コンストラクター
    • 7.5 クラスメソッド/クラスフィールド
    • 7.6 引数/戻り値のさまざまな記法
  • 8章 オブジェクト指向構文(カプセル化/継承/ポリモーフィズム)
    • 8.1 カプセル化
    • 8.2 継承
    • 8.3 ポリモーフィズム
  • 9章 オブジェクト指向構文(名前空間/例外処理/ジェネリックなど)
    • 9.1 名前空間
    • 9.2 例外処理
    • 9.3 列挙型
    • 9.4 特殊なクラス(入れ子のクラス/パーシャルクラス)
    • 9.5 ジェネリック
    • 9.6 Objectクラス
    • 9.7 演算子のオーバーロード
  • 10章 ラムダ式/LINQ
    • 10.1 デリゲート/匿名メソッド/ラムダ式
    • 10.2 LINQ
  • 11章 高度なプログラミング
    • 11.1 マルチスレッド処理
    • 11.2 属性
    • 11.3 動的型付け変数(dynamic型)
    • 11.4 イベント

独習C 新版

10/1に Microsoft MVP を受賞しました。カテゴリは Visual Studio and Development Technologies です。

Microsoft 関連のテクノロジーを使用した開発を行う上で各コミュニティの先輩方の助けがあってなんとかなった部分は数え切れません。

感謝するとともに、自分もより多くの人の役に立てるようにいっそうがんばります。

以下、自分とコミュニティの関わりについて書きます。

MS MVP が何か、どういうメリットがあるか等については何も触れていないので、そういう情報が必要な方は公式サイトをご覧ください。

C# との出会い

僕は「エンジニア」という職業に憧れ、2015年1月に SIer 営業から転「職」しました。

SIer企画営業をやめ、クラウド会計ソフトのfreeeでエンジニアとして働きます

最初の7ヶ月くらいは大体 Ruby を書いて(※書けない)過ごしましたが、2015年7月頃突然 Windows デスクトップアプリのプロジェクトにアサインされました。

それが C# や Visual Studio との出会いです。

まぁ何もわからなかったです。

前職で C# で書いていた UXデザイナーさんに Visual Studio の使い方を教えてもらったのは今となってはよい思い出です。

レビュー以外は基本的に自分しか触らない、ということは自分が開発を進められなかったらこの機能は世に出ない…!というプレッシャーがすごかったです。

(会社の中でわからないことを聞いても教えてくれる人はいたのかもしれませんが、)そのタイミングで利用し始めたのが teratail (もちろん Stack Overflow とかも)だったりします。

@Tak1wa さんを始めたくさんの方にすごいスピードで助けていただきました。

その助けがなければリリースまでたどり着かなかったかもしれない機能もたくさんあります。

感謝してもしきれません。

ここからオンライン・オフラインでの「コミュニティ」との関わりが始まりました。

はじめての Qiita

助けてもらってばかりの日々が続きましたが、無事大きな機能もリリースにこぎつけ、今度は自分も何か書いてみよう!と思っていると、世間は Qiita の( Qiita をはじめとする?) Advent Calendar で賑わっていました。2015年の12月のことです。

はじめての Qiita 記事は C# の Advent Calendar です。

Windowsアプリで出たバグをBugsnagで管理し、Trelloでタスク化し、slackに通知する

C# との闘争

2016年になり、Windows アプリのメンテや機能拡張が半稼働、Ruby で書くのが半稼働という日々が続きました。

正直頭切り替えるのしんどいし、どっちも中途半端だし、C# での開発は社内でメインストリームではない…ということでだいぶモヤモヤしていました。

しかし、紆余曲折を経て、腰を据えて C# を勉強することに決めました。

2016年の5、6月には C# の基本書を改めて読み、 Qiita 記事も色々と書き始めます。

設計もできるようになりたいという思いで、『Java言語で学ぶデザインパターン入門』を C# で書き直すという Qiita 記事も書き始めました。

C#で学ぶデザインパターン入門 ①Iterator

はじめての .NET 関連勉強会

そういう言えば C# なり .NET なり勉強会行ったことないよな…と思い、行ってみることにしました。

近々開催予定だったのが .NET Fringe Japan 2016です。(2016/10/1)

Ruby や JavaScript の勉強会と雰囲気(いる人の層?)が全然違うし、何より何言ってるかさっぱりわからなかった気がします。

今思えば最初に行く勉強会としては誤りだったと思う一方、メンバーの濃い本当に貴重な勉強会だったと思います。

はじめての Xamarin

C# でモバイルアプリの開発ができるとか何とか?という話を聞き、へ〜って思っていると、Xamarin Dev Days Tokyo というイベントがあるというのを知りました。

世界中で Xamarin のハンズオンイベントをやるとのことで、参加してみることにしました。

環境構築が全然進まず困っていたところ、@_shunsuke_kawaiさんや @atsushienoさんに助けていただきました。

atsushieno さんが Xamarin の中の人だということは後から知りました。

Japan Xamarin User Groupという日本の Xamarin ユーザグループもあり、勉強会もほぼ毎月行なっているということを知りました。

その年の会社 Advent Calendar では C# というかなんというかな話を書きました。

技術的マイノリティプロジェクトで幸せに過ごすための5つの方法

年が明けるともっと Xamarin のことを知りたいと思い、 Xamarin.Forms 本の邦訳読書会にも参加し始めました。

XamarinFormsBookReading

そして自分でも Xamarin.Forms を使って簡単なアプリを作り始めました。(2017年4月)

Xamarin.Formsで家の日用品管理アプリを作り始めたお話

はじめての機械学習

Xamarin に触れる一方で、社内では機械学習の勉強会に参加していました。

Coursera の機械学習を見つつ、その演習問題をやってみたり、Kaggle の問題を解いてみたり。

その文脈で Azure Machine Learning に出会い、そのわかりやすさに感動してこの本をベースに社内でハンズオンをやってみました。(2017年4月)

インサイド Xamarin

会社でも Xamarin で開発をすることが決まり、de:code にも参加して Xamarin の話を聞くぞ!予習するぞ!というときにある連載に出会いました。

インサイドXamarin

Xamarin に限らず、ビルドとかコンパイルって何することなんやろう?そもそも .NET って何?みたいなことがとても気になり始めていた時期(遅)で、衝撃的に面白かったです。

理解できてない部分は多いとは思いますが、詳しく知りたい気持ちが増す大きなきっかけになりました。

はじめての LT

思うところがあり、2017年6月から LT をし始めました。

その経緯はこの記事に詳しく書いています。

Tokyo Jazug Nightで「Azure FunctionsとAWS Lambdaの開発フローの違い」を話してきました。初めての登壇とその理由 #jazug

はじめての LT は日本の Azure のユーザグループである JAZUG で行いました。

これからもっと Azure を使って行く予定なので、もっともっと実践的な知見を共有できたらと思います。

Microsoft MVP

その後もイベントでの登壇やサポートをしたり、業務関連の Xamarin 記事を書いたり翻訳したり、たまにコードを GitHub に上げたりしていました。

その結果、2017年8月までの1年間の活動を評価していただき、Microsoft MVP を受賞しました。

自分のエンジニアとしてのキャリアと Microsoft 関連技術は密に結びついており、とても嬉しくて受賞した日はほとんど眠れませんでした。

(訳あって9月以降の実績を含まずに受賞できたら嬉しいなぁ…と思っていたりもしました)

会社のチームに報告したり、全社集会で報告したり、察して祝っていただいたり、全社集会で報告する日にMVP Kitが届き開封の儀を執り行ったり、自分のことのように喜んでくれる人がいたりで徐々に実感も湧いてきました。

ただ、評価指標はあくまでコミュニティへの貢献で「エンジニアとしてどうか」ということではないと思っています。

今後、MVP を受賞したことで得られる機会を最大限活用し、これまでお世話になった方々のように多くの人が一歩踏み出す力になれるよう努力し、エンジニアとしてより大きな問題を解決できるよういっそう精進していきます。