Java大好きー。
閑話休題。最近、C#をさわる機会がありました。
C#はJavaと類似性が多い言語と思っていましたが、
触っているうちに、ぜんぜん違うおしゃれな構文もあることを見つけました。
本日はそのおしゃれな構文の中から厳選して3つ書いていきたいと思います。
out パラメータ修飾子
引数として、値を戻す変数を指定できちゃいます。
class Program
{
static void Main(string[] args)
{
int one, two;
ReturnTwo(out one, out two);
Console.WriteLine($"{one}, {two}");
}
public static void ReturnTwo(out int one, out int two)
{
one = 1;
two = 2;
}
}
{1, 2} と出力されます。例のように、引数に指定した変数に値を入れてくれるので、複数の値をメソッドから呼び出し元に返却することも可能です。
まるでポインタ渡しですね。おしゃれ。
ジェネリック メソッド
Javaでもおなじみジェネリックですが、C#だとちょっとおしゃれな書き方ができます。
using System;
class Program
{
static void Main(string[] args)
{
var date = createNewInstance<DateTime>();
Console.WriteLine($"{date}");
}
public static T createNewInstance<T>() where T : new()
{
return new T();
}
}
Javaだと引数にClass型の値(Date.classとか)を入れそうですが、C#のジェネリクスはメソッド実行時につけることができるのです。おしゃれ。
拡張メソッド
別で定義されているクラスに、メソッドを追加することができます。
using System;
static class Program
{
static void Main(string[] args)
{
"fuga".HogehogePrint();
}
public static void HogehogePrint(this string arg)
{
Console.WriteLine("hogehoge " + arg);
}
}
string にHogehogePrintというメソッドを追加してやりました。
この拡張メソッドの相当おしゃれなところは、拡張メソッドを別定義しておいて、それをusingするだけで、メソッドが拡張できちゃうところです。
こんななんの変哲もないクラスでも、
using MyExtension;
static class Program
{
static void Main(string[] args)
{
"fuga".HogehogePrint();
}
}
MyExtensionをusingするだけで、もともと定義されていなかったメソッドがクラスに追加されちゃうのです。
using System;
namespace MyExtension
{
public static class Extension
{
public static void HogehogePrint(this string arg)
{
Console.WriteLine("hogehoge " + arg);
}
}
}
LINQなどもこの仕組をつかって、配列にJavaのStreaming APIのような動きをつけているようです。むちゃくちゃおしゃれですね。
まとめ
まだまだC#の初学者ですが、おしゃれだと思う3選上げてみました。
Javaのほうが好きです。