1. ホーム
  2. c#

[解決済み] C#でインライン関数を作成する方法

2022-01-30 07:57:38

質問

Linq To XMLを使用しています。

new XElement("Prefix", Prefix == null ? "" : Prefix)

しかし、プレフィックスを xml に追加する前に、スペースや特殊文字を削除したり、何らかの計算をしたりしたいのです。

この関数は、私のプログラムの他の部分には何の役にも立たないので、関数を作りたくありません。

どのように解決するのですか?

はい、C#はそれをサポートしています。いくつかの構文が用意されています。

  • 匿名メソッド は、C# 2.0 で追加されました。

    Func<int, int, int> add = delegate(int x, int y)
    {
        return x + y;
    };
    Action<int> print = delegate(int x)
    {
        Console.WriteLine(x);
    }
    Action<int> helloWorld = delegate // parameters can be elided if ignored
    {
        Console.WriteLine("Hello world!");
    }
    
    
  • ラムダ は C# 3.0 の新機能で、2 種類のタイプがあります。

    • 式ラムダ。

      Func<int, int, int> add = (int x, int y) => x + y; // or...
      Func<int, int, int> add = (x, y) => x + y; // types are inferred by the compiler
      
      
    • ステートメントラムダ。

      Action<int> print = (int x) => { Console.WriteLine(x); };
      Action<int> print = x => { Console.WriteLine(x); }; // inferred types
      Func<int, int, int> add = (x, y) => { return x + y; };
      
      
  • ローカル機能 は C# 7.0 で導入されました。

    int add(int x, int y) => x + y;
    void print(int x) { Console.WriteLine(x); }
    
    

これには基本的に2つのタイプがあります。 Func Action . Func は値を返しますが Action はない。の最後の型パラメータは Func は戻り値の型であり、それ以外はパラメータの型である。

名前の違う似たような型がありますが、インラインで宣言するための構文は同じです。その例として Comparison<T> とほぼ等価である。 Func<T, T, int> .

Func<string, string, int> compare1 = (l,r) => 1;
Comparison<string> compare2 = (l, r) => 1;
Comparison<string> compare3 = compare1; // this one only works from C# 4.0 onwards

これらは通常のメソッドと同じように直接呼び出すことができます。

int x = add(23, 17); // x == 40
print(x); // outputs 40
helloWorld(x); // helloWorld has one int parameter declared: Action<int>
               // even though it does not make any use of it.