2007年08月17日
C#3.0:ラムダ式
ラムダ式
このコードは、delegateの動きを説明した C#1.1のコード。
これが、C#2.0になると、こんな書き方になる。
わざわざ Tripleというメソッドを定義する必要がなくなったわけだ。
そして、C#3.0では、
ここまでは、C#2.0 と C#3.0 では、記述方法が変化しただけと見ることもできる。
さらに、
と書ける。さらに、この(*)の記述が、
と短くすることができる。
いきなり、最後の文を見せられたときは、いきなり出てきた xって何だ?
と面食らったけど、順番に見ていけば、それほど難しくはない。
でも、慣れるのが大変そう。
delegate int MyFunction(int i);
static int Triple(int n) {
return n * 3;
}
static void Test() {
// C#1.1
MyFunction f = new MyFunction(Triple);
int n = f(11);
Console.WriteLine(n);
}
このコードは、delegateの動きを説明した C#1.1のコード。
これが、C#2.0になると、こんな書き方になる。
delegate int MyFunction(int i);
static void Test() {
// C#2.0 匿名メソッド
MyFunction f3 = delegate(int x) { return x * 3; };
n = f3(20);
Console.WriteLine(n);
}
わざわざ Tripleというメソッドを定義する必要がなくなったわけだ。
そして、C#3.0では、
delegate int MyFunction(int i);
static void Ramda() {
// C#3.0 ラムダ式
MyFunction f4 = (int x) => { return x * 3; }; // (*)
n = f4(30);
Console.WriteLine(n);
}
ここまでは、C#2.0 と C#3.0 では、記述方法が変化しただけと見ることもできる。
さらに、
MyFunction f4 = (int x) => return x * 3; // (*)
と書ける。さらに、この(*)の記述が、
MyFunction f4 = (int x) => x * 3;
MyFunction f4 = (x) => x * 3;
MyFunction f4 = x => x * 3;
と短くすることができる。
いきなり、最後の文を見せられたときは、いきなり出てきた xって何だ?
と面食らったけど、順番に見ていけば、それほど難しくはない。
でも、慣れるのが大変そう。
2007年08月13日
Control.Invokeの書き方
Control.Invokeの書き方について、ちょっと考察。
これが、C#1.1の頃の書き方。
これが C#2.0になると、
と書ける。さらに、 MethodInvoker という delegateが定義済みなので、
とさらに簡単になる。
しかし、次の書き方がどうしてOKなのかが、はっきりとは分からない。
たぶん、
が、
って書けるのと関係しているんだと思うけど...
誰か教えてくれないかな。
...
そんなことより、
で良いと思うんだけど。これだとエラーになってしまう。
private delegate void MyDelegate();
private void MyDisplay() {
label1.Text = "ほにゃらら";
}
private void Foo(...) {
this.Invoke(new MyDelegate(MyDisplay));
}
これが、C#1.1の頃の書き方。
これが C#2.0になると、
private delegate void MyDelegate();
private void Foo(...) {
this.Invoke(new MyDelegate(delegate {
label1.Text = "ほにゃらら";
}));
}
と書ける。さらに、 MethodInvoker という delegateが定義済みなので、
private void Foo(...) {
this.Invoke(new MethodInvoker(delegate {
label1.Text = "ほにゃらら";
}));
}とさらに簡単になる。
しかし、次の書き方がどうしてOKなのかが、はっきりとは分からない。
private void Foo(...) {
this.Invoke((MethodInvoker)delegate {
label1.Text = "ほにゃらら";
});
}たぶん、
button1.Click += new EventHandler(button1_Click);
が、
button1.Click += button1_Click;
って書けるのと関係しているんだと思うけど...
誰か教えてくれないかな。
...
そんなことより、
private void Foo(...) {
this.Invoke(delegate {
label1.Text = "ほにゃらら";
});
}で良いと思うんだけど。これだとエラーになってしまう。



