2013
08
30
08
30
BooとC#のちょっとした違い(おまけでJavaScriptも)
Booは静的型付け言語ながら、変数宣言がPythonと同様に”x = 0”とシンプルな式で行える。
C#では型を教えてやる必要がある。varを使ってもいいが。"int x = 0;"
クロージャを使う場合を考える。下記のように書くと、スコープの関係から匿名関数内から上位スコープにあるxが参照できるので、innerFuncの実行がxの値を書き換えてしまう。実行すると10が表示される。クロージャの中と外で変数名の重複があるとまずいということ。
というわけで一句はさんで匿名関数の中の変数xを宣言する。こうすることで関数Mainのスコープにある変数xの値は0が保たれる。
C#で上記にあるようなことをしようとすると、コンパイラが親切にエラーを出してくれる。「スコープ内に同じ名前の変数が使われてるから、その名前の変数は使わないで」
ちなみにJavaScriptでは実行可能。
C#では型を教えてやる必要がある。varを使ってもいいが。"int x = 0;"
クロージャを使う場合を考える。下記のように書くと、スコープの関係から匿名関数内から上位スコープにあるxが参照できるので、innerFuncの実行がxの値を書き換えてしまう。実行すると10が表示される。クロージャの中と外で変数名の重複があるとまずいということ。
import System
def Main():
x = 0
innerFunc = def():
x = 10
innerFunc()
print x
print "Press any key to continue . . . "
Console.ReadKey(true)
というわけで一句はさんで匿名関数の中の変数xを宣言する。こうすることで関数Mainのスコープにある変数xの値は0が保たれる。
import System
def Main():
x = 0
innerFunc = def():
x as int = 10
innerFunc()
print x
print "Press any key to continue . . . "
Console.ReadKey(true)
C#で上記にあるようなことをしようとすると、コンパイラが親切にエラーを出してくれる。「スコープ内に同じ名前の変数が使われてるから、その名前の変数は使わないで」
public static void Main(string[] args)
{
var x = 0;
Action innerFunc = delegate()
{
var x = 10;
};
innerFunc();
Console.WriteLine(x);
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
ちなみにJavaScriptでは実行可能。
function func()
{
var x = 0;
var innerFunc = function(){x = 10};
innerFunc();
alert(x);
}
func();
スポンサーサイト