セミコロンレスC#とは
Javaを習得している者として最早一般常識となりつつあるセミコロンレスJavaですが、
C#のそういう話題をあまり見ないなと思って少しだけ書いてみました。
Hello, World
Hello.cs
namespace SemicolonLess
{
public class Program
{
public static void Main(string[] args)
{
if (Encoding.Default.GetBytes("Hello, Semicolon-Less world!\n") is var hellobytes &&
Console.OpenStandardOutput().WriteAsync(hellobytes, 0, hellobytes.Length) == null){ }
}
}
}
変数の宣言
VarString.cs
if ("string" is var s) { }
変数の宣言は is
型パターンで行います。
できないだろうなと思ってvarにしたらコンパイル通ったのでびっくりしました
もちろん複数宣言したい場合は&で繋げればよいので、
VarString2.cs
if ("Hello" is var hello && "world" is var world) { }
ということになります。
標準出力
Console.WriteLine
を使いたいところですが、Console.WriteLine
はvoid
型なのでif
文内部には使用できません。
なのでConsole.OpenStandardOutput()
で標準出力を取ってきてWriteAsync()
してやればできます。
値の加工
MultipleDouble.cs
if (1 is var x && (x = x * 2) != 1) { } //Intなので恐らく2倍して1になる数値はない
FizzBuzz
FizzBuzz.cs
namespace SemicolonLess
{
public class Program
{
public static void Main(string[] args)
{
if (Enumerable.Range(1, 100)
.Select(a => (a, (a % 3 == 0 ? "Fizz" : "") + (a % 5 == 0 ? "Buzz" : "")))
.Select(b => (string.IsNullOrEmpty(b.Item2) ? b.a.ToString() : b.Item2) + "\n")
.Select(Encoding.Default.GetBytes)
.Select(c => Console.OpenStandardOutput().WriteAsync(c, 0, c.Length)).ToList() != null) { }
}
}
}
多分考えればもっと簡潔に書けると思いますが、とりあえずセミコロンレスにするだけした感じ。
結論
セミコロンC#がそんなになかったのはそれなりに理由があった
-
is
型パターン - LINQ
- Task
があればセミコロンがなくても大体のことはできる