6

私は日常的に Javascript と C# の両方を使用しており、Javascript を使用する際に巻き上げを考慮する必要がある場合があります。ただし、C#は(私が知っている)巻き上げを実装していないようで、その理由がわかりません。それは設計上の選択ですか、それとも静的に型付けされたすべての言語に適用されるセキュリティまたは言語の制約に似ていますか?

記録として、私はそれが C# に存在することを望んでいると言っているわけではありません。なぜそうならないのかを理解したいだけです。

編集:LINQクエリの後に変数を宣言したときに問題に気付きましたが、LINQクエリは変数宣言の後まで延期されました。

    var results = From c In db.LoanPricingNoFee Where c.LoanTerm == LoanTerm
                   && c.LoanAdvance <= UpperLimit Select c
                   Order By c.LoanInstalment Ascending;

    Int LoanTerm = 12;

次の場合にエラーをスローします。

    int LoanTerm = 12;

    var results = From c In db.LoanPricingNoFee Where c.LoanTerm == LoanTerm
                   && c.LoanAdvance <= UpperLimit Select c
                   Order By c.LoanInstalment Ascending;

ではない。

4

5 に答える 5

11

私が使用したすべてのプログラミング言語の中で、Javascript は最も紛らわしいスコープ システムを持っており、巻き上げはその一部です。その結果、JavaScript では予測不可能なコードを簡単に記述できるようになり、強力で表現力豊かな言語にするためには、その記述方法に注意する必要があります。

C# は、他のほとんどすべての言語と同様に、変数を宣言するまで変数を使用しないことを前提としています。コンパイラがあるため、宣言されていない変数を使用しようとすると、コンパイルを拒否するだけで強制できます。これに対するもう 1 つのアプローチは、スクリプト言語でよく見られるものですが、変数が宣言されずに使用された場合、最初の使用時にインスタンス化されます。これにより、コードの流れをたどるのがやや難しくなる可能性があり、そのように動作する言語に対する批判としてよく使用されます。ブロック レベル スコープ (変数が宣言されたレベルにのみ存在する変数) を持つ言語を使用したことのあるほとんどの人は、それが Javascript の特に奇妙な機能であることに気付きます。

吊り上げが問題を引き起こす可能性があるいくつかの大きな理由:

  • これは完全に直感に反するものであり、この動作を意識しない限り、コードを読みにくくし、その動作を予測するのを難しくします。読みにくく、予測しにくいコードには、バグが含まれる可能性がはるかに高くなります。
  • コード内のバグの数を制限するという点では、変数の有効期間を制限すると非常に役立ちます。変数を宣言して 2 行のコードで使用できる場合、それらの 2 行の間に 10 行のコードがあると、変数の動作に誤って影響を与える可能性が高くなります。Code Completeには、これに関する多くの情報があります。これを読んでいない場合は、心からお勧めします。
  • 最小の驚きの原則という古典的な UX コンセプトがあります。巻き上げのような機能 (または Javascript が平等を処理する方法のようなもの) は、それを破る傾向があります。プログラミング言語を開発するときにユーザー エクスペリエンスについて考えることはあまりありませんが、実際には、プログラマーは非常に目の肥えたユーザーであり、奇妙な機能に日常的に巻き込まれると少し不機嫌になる傾向があります。Javascript は非常に幸運なことに、ブラウザー内で独特のユビキタス性を発揮することで、ある種の強制的な人気が生まれ、その多くの癖や問題のある設計上の決定を許容しなければなりませんでした。

最後に、これが C# のような言語に追加されると便利な理由が想像できません。どのような利点があるのでしょうか?

于 2013-09-12T10:01:18.930 に答える
9

「それは設計上の選択ですか、それとも静的に型付けされたすべての言語に適用されるセキュリティまたは言語の制約に似ていますか?」

静的型付けの制約ではありません。コンパイラがすべての変数宣言をスコープの先頭に移動し (Javascript ではこれが関数の先頭、C# では現在のブロックの先頭)、名前が異なる型で宣言されている場合はエラーになるのは簡単なことです。

したがって、ホイストが C# に存在しない理由は、純粋に設計上の決定です。なぜそのように設計されたのか、私がチームに所属していなかったとは言えません。しかし、変数が使用前に常に宣言されている場合、おそらく解析が容易なためです (人間のプログラマーとコンパイラーの両方にとって)。

于 2013-09-12T10:01:55.923 に答える
2

これは不完全な概念であるため、JavaScript の急いで実装したために存在する可能性が最も高いです。これは、経験豊富な JavaScript コーダーでさえ、変数のスコープについて誤解を招く可能性があるコーディングへの悪いアプローチです。

于 2013-09-12T09:46:49.950 に答える