主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

BooとC#のちょっとした違い(おまけでJavaScriptも)

                
Booは静的型付け言語ながら、変数宣言がPythonと同様に”x = 0”とシンプルな式で行える。
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();
スポンサーサイト



プロフィール

h

Author:h

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon