Unity——λ式(無名関数)/Linq/コールバック関数

1: ラムダ式 (無名関数)

匿名関数 (匿名メソッド)

コードのブロックをデリゲート パラメーターとして渡す手法を提供します。名前はなく、本体のみがあります。

例:

1: 最初にデリゲートを宣言します

delegate void MyDelegate(string name, int age);

通常の実践では:

2:委任を通じて関数を呼び出すために次のアプローチを採用します。

対応するメソッド:

public void Student(string name , int age)
    {
        Debug.Log("My name is " + name + ", and my age is " + age + ".");
    }

3: メソッドの呼び出し:

MyDelegate studentDelegate = new MyDelegate(Student);
            studentDelegate("小王", 1);
            //studentDelegate.Invoke("小王", 1);

4: 次に、匿名関数を使用します。

StudentDelegate studentDelegate1 = new StudentDelegate(delegate (string name, int age)
            {
  //注意:这个方法本来在外面。是无法访问到DateTime的实例,但是放在方法体里面就可以访问了
                Debug.Log(dateTime);
                Debug.Log("我是" + name + ",我年龄是" + age);
            });
            studentDelegate1("小李", 2);

これは、メソッドのすべてのパラメーターとメソッド本体を Delegate エンティティに詰め込み、関数名のみを削除することと同じです。

5: ラムダ式を導入します

上記のコード セグメントでもデリゲートを破棄し、括弧内のパラメーターの後に => (シンボルに移動) を使用して関数本体を指します。

StudentDelegate studentDelegate2 = new StudentDelegate( (string name, int age)=>
        {
            Debug.Log(dateTime);
            Debug.Log("我是" + name + ",我年龄是" + age);
        });

6: ラムダ式のその他の例

Action action = () => Debug.Log("无返回值,无参数");

アクション デリゲートを宣言し、関数を内部的に転送します。戻り値もパラメーターもありません。パラメーターの後には、関数本体を指す Goes to ポインターが続きます。

Action<DateTime> action1 = time => { Debug.Log("没返回值,一个参数"); };

デリゲートを宣言します。戻り値はありません。パラメータは 1 つだけです。パラメータ名は time、その他は上記と同じです。

Func<DateTime > func = () => { return DateTime.Now; };

Func デリゲートには戻り値があり、パラメーターも戻り値もないため、括弧は空括弧であり、戻り値は中括弧内にあります。

上記のコード スニペットは、次のように簡略化することもできます。

Func<DateTime> func1 = () => DateTime.Now;

中括弧を省略する

7: Unity でのラムダ式の使用 (AddListener)

リスナー イベントをボタンに追加する例を見てみましょう。

button.OnClick.AddListener

AddListener を例として取り上げます。公式の説明は次のとおりです。

新しいEventにリスナーを追加します。呼び出されたときに MyAction メソッドを呼び出します

使用方法は次のとおりです。

UnityEvent m_Event = new UnityEvent();

m_Event.AddListener(MyAction);

つまり、イベントにリアクションを追加する

そのコードは次のように定義されています。

public void AddListener(UnityAction call);

したがって、内部パラメータはデリゲート型である UnityAction であるため、ラムダ式を内部で使用できます。

したがって、イベント リスナーを追加するための省略表現は次のようになります。

button.OnClick.AddListener((没参数)=> Debug.Log("1");    );

2:リンク

LINQ (統合言語クエリ): 言語統合クエリは
クエリの操作ライブラリとしても使用され、その核となるのはデータ ソースの操作です。

次の 3 つの機能があります。

1. LINQ to Object クエリ オブジェクト
2. LINQ to XML クエリ XML ファイル
3. LINQ to ADO.NET クエリ データベース

以下のコードは、通常のクエリから LINQ クエリ、そしてカスタム メソッドへの進化を示しています。

public class LinqExample : MonoBehaviour
{
    private void Start()
    {
        Show();
    }
    public void Show()
    {
        List<StudentList> studentlist = new List<StudentList>()
        {
            new StudentList
            {
                Id = 1,
                Name = "张三",
                Age = 1,
                Address = "北京"
            },
            new StudentList
            {
                Id = 2,
                Name = "李四",
                Age = 2,
                Address = "上海"
            },
            new StudentList
            {
                Id = 3,
                Name = "王五",
                Age = 3,
                Address = "广州"
            },
            new StudentList
            {
                Id = 4,
                Name = "雷六",
                Age = 4,
                Address = "深圳"
            },

        };//数据源
        {
            Debug.Log("--------------------普通查询--------------------");
            foreach (var   item in studentlist)
            {
                if(item.Age >= 2)
                {
                    Debug.Log($"Id: { item.Id},姓名:{item.Name}");
                }
            }

            Debug.Log("--------------------LINQ查询(扩展方法)--------------------");
            //这里的Where是扩展方法,是小方块旁边有向下的箭头
            var list = studentlist.MyWhere( s => s.Age >= 2);//返回值是bool类型



            //完整的使用应该如下,花括号和return都可以省略
            //studentlist.Where((s) => { return s.Age >= 2; });

            //这里我们将遍历查询放到了前面,使用了LINQ的扩展方法where
            foreach (var item in list)  
            {
                Debug.Log($"Id: { item.Id},姓名:{item.Name}");
            }


            Debug.Log("--------------------LINQ查询(关键字)--------------------");

            var list1 = from s in studentlist
                        where s.Age >= 2
                        select s;

            //下面是一样的
        }
    }
}
/// <summary>
/// LinqWhere的源代码
/// 自行编写修改
/// </summary>
public static class ExtendMethod
{
    public static List<StudentList> MyWhere(this List<StudentList> resource, Func<StudentList, bool> func)
    {
        var list2 = new List<StudentList>();
        foreach (var item in resource)
        {
            if(func.Invoke(item))
            {
                list2.Add(item);
            }
        }
        return list2;
    }
}


public class StudentList
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public string Address { get; set; }
}

フィールドを保存する StudentList クラスを作成します。

次に、Show メソッドでいくつかのフィールドをインスタンス化します。

通常のクエリ: foreach ループを使用し、if を追加して判断します

LINQ 拡張メソッドのクエリ: 定義された Where とラムダ式を使用してクエリを実行します

カスタム Where については、静的クラス ExtendMethod の静的メソッド MyWhere を参照してください。

戻り値は学生リスト、パラメータは学生リストとFuncデリゲート、Funcデリゲートのパラメータは学生リスト、戻り値はbool型

3: コールバック関数/テンプレートメソッド

コールバック関数 (CallBack Function):

関数の名前が引数として渡された場合、その関数はコールバック関数です。

それ自体は特別なものではなく、パラメータとして使用されることを意味します。

テンプレートメソッド:

おすすめ

転載: blog.csdn.net/leikang111/article/details/129328981