13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

非.NET言語勢よ。これが.NET言語のずるい機能だ!

Last updated at Posted at 2024-11-24

 今回は.NET言語(C#やF#)勢の私が他の言語にはない(C#やF#にはないと思われていたと思う)機能を紹介します(Visual Basic .NETは除外)。

C#のずるい機能

1. LINQ

 LINQ to ObjectsとLINQ to SQLはC#3.0に登場したかなりの古参勢です(現在、C#13.0)。
 特にLINQ to Objectsは配列に対する処理に特化しており、繰り返しで複数行必要なところを一行で、しかも高速に処理できます。
 配列全体に決まった処理を行ったり、高階層オブジェクトを平坦化たり、様々なことができます。

2. クラス全般

2-1. プライマリコンストラクタ

 Javaとかしている人は「C#とJavaの文法は似ているから違いはほとんどない」と思いがちですが、全く違います。もちろん、C#はJavaの書き方と似ています。しかし、プロパティの値を初期化するだけの場合コンストラクタは以下のように

class Position(int _x, int _y)
{
    public int x = _x;
    public int y = _y;
}

クラス宣言時に定義できます。

2-2. new式

 上のコードのインスタンスを作るとき、Javaをやっている人だと

class Program
{
    void main()
    {
        Position p = new Position(0, 0);
    }
}

見たいな感じで書きますよね。しかし、C#勢は

class Program
{
    static void Main()
    {
        Position p = new(0, 0);
    }
}

と書きます。C#言語は型が明示的に書かれている場合newの後のクラス名を省くことができます。

3. 配列の要素の値の取得

 C#8.0では配列のある範囲の要素を取り出すことができます。

4. 最上位ステートメント

 非C#勢の人は「JavaとかC#はクラスの中にエントリーポイントを書くから、面倒くさいな」と、思うと思います。C#はそんなことありません。Visual C#9.0(C#9.0)ではエントリーポイントのあるファイルに、エントリーポイントのメソッドとそれを含むクラスを書かなくても良いです。

5. メソッド

int increment(int n)
{
    return n + 1;
}

 上のようにC系の言語って値に1を足して返すとかのメソッドを書くときに無駄があるよねって思われますが、C#では=>演算子を使って

int increment(int n) => n + 1;

と書けます。

6. out変数

 数値型であればTryParseを使うことで、out変数が作れます。

7. コレクション式

 List<T>からT[]に変換する際、

using System;
using System.Collections.Generic;

List<int> list = [1, 2, 3];
int[] array = list.ToArray();

と書いていたでしょうか。しかし、今では

using System;
using System.Collections.Generic;

List<int> list = [1, 2, 3];
int[] array = [.. list];

と書けます。

F#のずるい機能

C#で使える名前空間を全て使える

 当然、C#とF#は.NET言語なのでC#で使えるものはF#でも使えます。

型の量が多い

 F#はC#の型に加え、独自の配列やリストといったものがあります。int[]int arrayは全く同じものですが、全然違うものです。int arrayはOCamlの書き方で値を代入しますが。int[]はOCamlの書き方で書いた値を関数に渡してから、代入します。使いやすさとしてはint arrayの方が使いやすいです。

クラス コンストラクタ

 「はいはい、どうせC#と同じでnew()と書くんでしょ」って思いますよね。その逆です!クラス名()と書きます。私としてはnew()であってほしんですけど、スクリプト言語だからなのでしょうね。

任意の演算子の定義

 私の中ではこれが一番ずるいと思っています。だって、新しい演算子を作ることができるのですから。例えば、左辺の文字列を右辺の文字でトリミングする--演算子を作るとしましょう。

let (--)(baseStr: string, trim: char) = String.trim(trim, baseStr)

と書けばできます。

標準ライブラリ

 F#は数値解析用言語とだけあって標準ライブラリの量が多いです。逆に多すぎて「何ができる?」と思います。

C#とF#

作れるもの

 C#で作れるものはコンソールアプリ、フォームアプリケーション、Webサイトなどです。なので、なんでも作れます。F#は、そういうのはできません。

連携

 C#とF#はランタイムが同じなので、Visual Studioではファイル参照で連携が可能です。ということはフォームアプリケーションなら描画をC#で、内部をF#で作ることができます。また、C#では限界のあることをF#を組み込むことで補い、逆にF#では限界のあることをC#で補うことができます。

まとめ

 C#とF#の他には無い機能について知れましたか。頭に浮かんだことを書いただけなので、他にもC#とF#の他の言語には無い機能があると思います。もしまだ私が書いていないC#やF#の他の言語にはない機能、自分の愛用している言語の他の言語には無いと思う機能があれば、是非コメントしてください。

13
8
18

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?