maxfie1d のブログ

マイクロソフト系技術ネタを中心に書きます。

C# には何故 let キーワードがないのか?

モダンな機能も取り入れつつ進化し続けているC#ですが、 イミュータブルの扱いがあまりよろしくありません。

Swift のletや、Kotlin のval に相当するものは C#にはないのでしょうか。

const ってあるじゃん

C/C++constとは違い、C#constコンパイル時に解決される値しか使えないのです。

readonly ってあるじゃん

クラスのフィールドなどには使えるのですが、ローカル変数には使えないのです。

C# で let キーワードは諦めるしかないのか...

実は数年前からローカル変数でのreadonlyは導入が検討されていて、 今にも入りそうなのですがまだ入っていない機能です。

github.com

提案にあるように、ローカルでreadonlyキーワードを使えるようにして さらにreadonly varの省略として新しくletvalキーワードを追加しようというものです。

// 全て同じ意味
readonly long maxBytesToDelete = (stream.LimitBytes - stream.MaxBytes) / 10;
readonly var maxBytesToDelete = (stream.LimitBytes - stream.MaxBytes) / 10;
let maxBytesToDelete = (stream.LimitBytes - stream.MaxBytes) / 10;
...
maxBytesToDelete = 0; // エラー: 宣言時以外での代入はできない

let キーワードは(おそらく)間もなく導入される

次の C# 8 では入ってくれ~(´;ω;`)