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):
関数の名前が引数として渡された場合、その関数はコールバック関数です。
それ自体は特別なものではなく、パラメータとして使用されることを意味します。