🥺

初心者が本当に知りたかったC#入門以前

2024/01/04に公開

C#の特徴的なところ

C#は変化が早い💨

  • 最近は毎年メジャーアップデート
  • 新記法、新しい書き方がモリモリ入る
  • しかも新しい書き方の方が便利で性能が良い(ことが多い)
  • 少し前のC#を知ってる人からするともう別物
解説

C#は6.0までゆっくりな変化だったんですが…
7.0から様子が変わって8.0以降は毎年変わるようになりました。

↓こちらのスライドの7ページから数枚が参考になります!

あんまり変わらないバージョンもありますが、特に大きなところだと,

  • null安全」になった (8.0)
  • パターンマッチング (7.0 - 10.0)
  • スクリプトみたいにいきなりかけるように (9.0 - 10.0)
  • 全部のコードのインデントが1つ減った (10.0)
  • 改行もインデントもできる生文字列リテラル (11.0)
  • 配列やコレクションの書き方が変わった (12.0)

スクリプトみたいに書けるようになったので入門記事のサンプルコードは全部書き換えないといけないレベルです。それまでは初心者には要らないお約束を毎回書いてましたから...

null安全とパターンマッチは使うと別言語レベルで変わりました。(たぶん他の言語でもそうだと思いますけど)

インデントが減ったのとコレクション式は普段の書き味めちゃくちゃ変わりました。
特にインデントは「減らそう、減らそう」と言われるわりに、文法的に実質無理じゃん…🥺、って所が減ったので読みやすさもエディタの幅も節約できてすごく実感があります。

C#は20年前のコードがそのまま動く

  • 互換性にめちゃくちゃ気を使ってる言語
  • 動かなくなることがあまりない
  • バージョン違いとかを意識しなくていいのはいいけど…
  • だから逆に、誰ももう書いてないような古い書き方でも動いちゃう
解説

「動くんだから古い書き方でええやんけ🤨」
と言えないのがC#。

古いのも動く、は、使ってても問題ない、と言うわけじゃなくて、

  • ミスしやすい
  • パフォーマンスが悪い

っていう感じで使ってるとマズイ感じのも色々あります。
他の言語ならdeprecatedにするやつを、残しちゃうんですよね。
新しいコードで古い書き方を書く理由はまああんまりないです。

入門記事や動画は信用できない

  • 変化が早いのに動かなくなることがないから情報が更新されない
  • 更新してても「古い→新しい」で説明するからムダが多い
  • どのバージョン(言語とランタイム)の情報なのかをしっかり確認して!
    • 鵜呑みしないでちゃんと公式もしらべてね!
解説

「最新です!」って顔した20年前・10年前の情報が簡単に出てきます…
だからcscでコンパイルするような初心者が後を絶たないんだと思います…

C#の場合、5年前の情報は使えないなぁという印象ですし、3年前でも「ちょっと怪しい」です。
(なのでこの記事の寿命も3年位かな…?)
今でも使えるのかどうか、別の方法になってないか、ちゃんと調べないと役に立ちません。

老舗のサイトとかも実は問題で、もうやらなくてもいい・知らなくてもいい古い情報が残ってるから混乱します。
公式のマニュアルも結構そんなところがあります。

C#は人によって言うことが違う

  • 変化が早いのに動かなくなることがないから知識が更新されない
  • 情報を追いかけてる人🧐とそうじゃない人😴で「言ってることが全然違う…🤔」が起きちゃう
  • いっぱいC#書いてても古い環境向けにしか書いてなくて知らない、ってことも良くある
  • ちゃんと追いかけてる人が言ってるかどうかをしっかり確認!
    • 鵜呑みしないでちゃんと公式もしらべてね!

普通のC#入門で教えてくれないこと

検索する時は"C#"じゃなくて"dotnet" "csharp" "csharp lang"

  • 記号が外れて検索に引っかかりません!
  • 記号が使えると今度は音楽用語がヒットします
    • コード(cord / chord)違い
  • ".NET"も検索にひっかからないので注意

AIが教えるC#は古臭い

  • AI (ChatGPTとかCopilotとか)はよくやる書き方を教えてくれる
    • なのでみんながよくやる間違いも正しい答えとして出してくる
  • C#の最新情報に追従できなくて古臭い感じのC#になる
    • 流行りの言葉だと思って「なぁぜなぁぜ」を無理やり使ってくるオジサンみたい…
    • どうせなら新しいのを入門しよう

https://zenn.dev/inuinu/articles/c60abf13d5f47a#aiが教えてくれないことも教えてくれる!

公式のAPIリファレンスは英語版で

https://learn.microsoft.com/en-us/dotnet/api/

公式マニュアルの調べ方のコツ(MS Learn)

APIリファレンス

  • 左上のバージョンが最新の.NETのバージョンになってるかどうか確認する
  • 右上の地球のアイコンを押して英語版にする
  • 地球アイコンの隣が「C#」になってるか確認する
    • 別の言語になってるとサンプルコードが違う言語になる

入門でC#を書くのに使うツール

  • 多くの場合は「Visual Studio」をオススメしてくるけど…
  • 公式入門のTry.NETブラウザだけで動く
    • だから入門だけならツールのインストールはいらない
    • 他にもブラウザだけで動く.NET FiddleやSharpLabもある
  • 軽くて他の言語を書くのにも便利な「Visual Studio Code」+「C# DevKit」もオススメ
    • macでもLinuxでもつかえるよ!
  • 有料なら「JetBrains Rider」もあるよ
    • プロはこれを使ってることも多いっぽい
  • メモ帳とかサクラエディタとか使っちゃダメ
    • C#はコード補完できるエディタじゃないと不便すぎる

ハマりポイント

「C#」と「.NET」の違い

  • この2つはごちゃまぜになって説明されることが多いです!

  • C# (しーしゃーぷ)

    • プログラミング言語自体のこと
    • 「C言語」「C++」とはまったく別物
  • .NET (どっとねっと)

    1. C#で使えるAPIのこと
    2. C#を動かすランタイムのこと
    3. 上2つと周辺技術を全部ミックスした環境のこと(広い意味)

「.NETなんとか」の違い

  • 「.NET」
    • 今の公式のランタイム/SDK
    • 執筆時点の最新は.NET 8.0
    • 広い意味のほうで使われることも良くある
  • 「.NET Framework」
    • 古いWindows限定のランタイム/SDK
    • 入門初心者はこれを使っちゃダメ
    • 最後のバージョンは.NET Framework 4.8系
    • この単語を使ってる入門記事・人はもう参考にしちゃダメ
  • 「.NET Core」
    • 今の「.NET」の古いバージョン(途中で名前が変わった)
    • サポート終了、もう使っちゃダメ

古いランタイム向けでも新しいSDKで作れる

  • 古い環境向けだから古い環境で作る…はしなくても実はいける
    • 古い入門記事を参考にしなくてもいい
    • 古い環境(.NET Framework)は今(.NET)と全然違うのでわざわざ古いもので作るのはつらい…
  • 最新のC#で古い環境向けにかける
    • わざわざ非効率な古い書き方しなくてもいい

最新のSDKで古い環境向けに出力設定する

巷の入門記事で見かけたウソ

【ウソ】「Windows専用」

  • Windows専用、っていうのはウソです!
  • 普通に標準でマルチプラットフォームです!
    • 古い「.NET Framework」のことを書いてます
  • 「monoがどうたら〜」「Unityがなんたら〜」って書いてあるのも古い!

【ウソ】「.NET Frameworkで動かす」

→「「.NETなんとか」の違い

  • C#のランタイムやSDKの名前はもう「.NET Framework」じゃないです!
  • 今は「.NET」っていう名前です
  • 「.NET Framework」はまだ使えるんですが、これを入門で使う理由はないです
  • この名前が残ってる入門記事・動画、めちゃくちゃ多いです…
    • 逆に古い内容の目印になります

【ウソ】「C#はJITコンパイル」

  • C#はネイティブコンパイルできます!
    • NativeAOTって呼ばれてます
  • JITコンパイルにするか、ネイティブコンパイルするか、選んでビルドするようになってます
  • ただし制限があるのでなんでもネイティブ化できるわけではないです

【ウソ】「C#のアプリはランタイム入れてないと動かない」

  • C#はビルドしたアプリ、そのまま動かせます
  • ランタイムが事前にインストールされてる環境向けに、容量小さくすることもできます
    • その時はランタイム入れてないと動きません
  • なにも設定しないとこれでビルドされちゃうのはワナですが…
.NETランタイム 容量 制限
ネイティブコンパイル(NativeAOT) 不要 小さい 多い
JITコンパイル 不要 大きい 少ない
JITコンパイル
(要ランタイム)
小さい 少ない

【ウソ】cscでコンパイル

  • C#のコンパイルにcscを使う、というのはウソ
    • (もう)直接このコマンドを叩くことはしません
  • Visual Studioでビルドするか、dotnet cliを使います
  • dotnet cliのdotnetコマンドのサブコマンドでコンパイルします
    • dotnet build
    • dotnet publish
    • dotnet test

【ウソ】Hello World

C#でこういう Hello World が出てきたら、大ウソです。

大ウソなHello World
using System;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

C#のHello Worldはこれです。

Console.WriteLine("Hello World!");
  • 1行で済むのに、なんでムダに書かせるんでしょうか…?
    • お約束、いります?
    • 初心者、嫌になっちゃうよ?
    • 動いちゃうんで、ダメなことに気が付かないというワナもあります

なんと、公式のマニュアルのチュートリアルもダメです。

https://learn.microsoft.com/ja-jp/dotnet/csharp/tour-of-csharp/

ただし、dotnet new consoleでつくったテンプレはちゃんと1行になってます。

dotnet new console
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

こんな入門記事が欲しかった

エディタはVS以外もオススメしてくれる

  • VS CodeやRiderみたいなクロスプラットフォームなエディタも教えてほしい
  • VS前提の記事はやめてほしい…

最新の.NET SDKのインストールを教えてくれる

  • ちゃんと最新のSDKのインストールを教えてくれる
  • 「.NET Framework」って(説明以外で)言わない

コードアナライザーを教えて有効にしてくれる

  • 初心者こそ教えてほしいヤツ

最新の無駄ない記法のサンプルコードで教えてくれる

  • お約束を書かないglobal usingやトップレベルステートメント
  • インデントが減るnamespace A;って書き方
  • タイプ量が減って初心者に優しい最新の記法でちゃんと教えてほしい
こういうコードみたいなの
Console.WriteLine("Hello, World!");

古い書き方はちゃんと古いと教えてくれる

  • そのまま残すんじゃなくて昔の書き方として区別して残してほしい
  • つかっちゃいけない書き方やAPIは「つかうな」って教えてほしい

dotnet cliの使い方を教えてくれる

  • ほかの言語だとバラバラだったり非公式だったりするツールが一つになってるのがdotnet cli
  • C#がプログラミング初心者向けだとおもう原因の一つなのでちゃんと教えてほしい

dotnet new

  • コピペや1文字ずつ入力じゃなくてテンプレを用意する方法を教えてほしい
    • dotnet new
  • C#以外の便利なファイルも作れることも教えてほしい
    • .gitignoreが作れるdotnet new gitignore
    • editorconfigが作れるdotnet new editorconfig

dotnet sln

  • ソリューションとプロジェクトの違いも教えてほしい

dotnet run / build / publish

  • コンパイルして実行、コンパイル、ビルドの違いを教えてほしい
  • クロスコンパイルのやり方も教えてほしい
  • ランタイム入りJIT、ネイティブビルド(NativeAOT)の使い分けも教えてほしい

dotnet add / remove

  • nuget.orgからのライブラリの導入方法も教えてほしい
  • 直接DLやNuGetコマンドじゃなくてdotnet addコマンドで

目的別の入門や調べ方を教えてほしい

  • C#はなんでも”そこそこ”できる言語
    • ベストじゃないけどベターな選択肢になれる言語
  • なのでいろんな目的に使える
  • いろんな目的別の簡単な入門や、調べ方を教えてほしい
    • もう使われない公式フレームワークとかあるのでそういうのは教えないような感じの…

まとめ

  • C#の特徴
    • 早い変化:毎年メジャーアップデートがあり、新しい書き方や記法が導入
    • 互換性:20年前のコードでも動作するが、情報の更新が追いつかない問題あり
  • 情報の信憑性
    • 入門記事や動画は信用できないことがある。C#のバージョンに基づいた公式情報を確認!
    • 言うことが異なる人が多く、情報が混乱する傾向がある
  • 検索と公式情報
    • 検索時に"C#"ではなく"dotnet"や"csharp"、"csharp lang"を使うことをオススメ!
    • 公式APIリファレンスは英語版がいいよ
  • C#の違い
    • C#と.NETの違い
    • 古い.NET Frameworkと.NET Coreと最新の.NETの違い
    • 最新の.NETを使うべき
  • ウソや誤解
    • 入門記事や動画に古くて誤った情報がよくある!
    • 「Windows専用」という誤情報や古い「.NET Framework」など
  • コンパイルとエディタ
    • cscコマンドの使用や過剰なHello World例はダメだよ!
    • 推奨されるエディタと最新のSDKのインストール方法
  • dotnet cliの利用
    • dotnetコマンドの使い方や便利な機能について教えてほしい!
    • ファイルの作成方法やプロジェクト管理、ライブラリの追加方法などを提案
  • C#の多様な利用方法
    • C#はいろんな用途にそこそこ使えるから、目的別の入門や調査方法を教えてほしかった!

Discussion