質問
私はPHPのwebプログラマの方を学習しようとしているC#.
私はなぜそうなC#が必要かを指定しデータ型は作成時の変数.
Class classInstance = new Class();
なぜなのかを知っておく必要がありまでのデータ型になる前にクラスのインスタンス?
解決
他の人が言ったように、C# は静的であり、厳密に型指定されています。しかし、私はあなたの質問を「なぜあなたは 欲しい C# はこのように静的/厳密に型指定されますか?これには動的言語に比べてどのような利点がありますか?」
それを念頭に置くと、正当な理由がたくさんあります。
- 安定性 コードが運用環境に近づく前に、特定の種類のエラーがコンパイラによって自動的に検出されるようになりました。
可読性/保守性 コードを読む将来の開発者に、コードがどのように機能するかについての詳細情報を提供することになります。特定の変数が特定の種類の値を保持することを目的としているという情報を追加すると、プログラマがその変数の目的を推論するのに役立ちます。
たとえば、Microsoft のスタイル ガイドラインが、VB6 プログラマには変数名に型プレフィックスを付けることを推奨しているが、VB.Net プログラマにはそれを推奨していないのはおそらくこれが理由です。
パフォーマンス これが最も弱い理由ですが、遅延バインディング/ダックタイピングは遅くなる可能性があります。結局のところ、変数とは、何らかの特定の方法で構造化されたメモリを指します。強力な型がないと、物理的に一方向に構造化されたメモリを論理的に別の方向に構造化されているかのように使用するため、プログラムは実行時にバックグラウンドで追加の型検証または変換を行う必要があります。
最終的には、厳密に型指定された言語でもこれらの変換を行う必要があることが多いため、この点を含めることは躊躇します。厳密に型指定された言語では、変換の正確なタイミングと範囲がプログラマに委ねられ、必要がない限り追加の作業は行われません。また、プログラマがより有利なデータ型を強制することもできます。しかし、これらは実際には、 プログラマー, 、プラットフォームではなく。
それ自体は、この点を省略する弱い理由になりますが、優れた動的言語はプログラマよりも適切な選択を行うことが多いという点を除けば、例外です。これは、動的言語が多くのプログラマーがより高速なプログラムを作成するのに役立つことを意味します。それでも、のために 良い プログラマにとって、強く型付けされた言語には、 潜在的 より速くなります。
- より良い開発ツール IDE が変数の予想される型を知っている場合は、その変数がどのような種類のことを実行できるかについて追加のヘルプを提供できます。IDE が型を推測する必要がある場合、これは非常に困難です。また、IDE から API の細かい点についてさらに多くのサポートを得ることができれば、開発者はより大規模で豊富な API を理解し、より早くそこにたどり着くことができるようになります。
あるいは、なぜ同じ行の同じ変数に対してクラス名を 2 回指定する必要があるのか疑問に思ったのではないでしょうか?答えは 2 つあります。
- そうしないこともよくあります。C# 3.0 以降では、
var
多くの場合、型名の代わりにキーワードが使用されます。この方法で作成された変数は静的に型付けされたままですが、型は 推測された コンパイラによってあなたのために。 - 継承とインターフェイスのおかげで、左側の型が右側の型と一致しないことがあります。
他のヒント
これは、言語が設計された単純方法です。 C#はCスタイルの言語であり、左の種類を持っていることのパターンに従います。
C#3.0とアップでは、一種のローカル型推論と、多くの場合、この問題を回避することができます。
var variable = new SomeClass();
しかし、同時にあなたも、あなたはまだLHSのタイプを宣言していると主張することができます。あなたは、コンパイラはあなたのためにそれを選択したいだけのこと。
編集
ユーザーが元の質問の文脈でこれをお読みください。
なぜ私たちは、変数名の前に[クラス名]を必要としますか?
私はこのスレッドでは、いくつかの他の回答にコメントしたかったです。多くの人が答えとして、「C#は静的に入力され、」与えています。文は(C#が静的に型付けされた)事実ですが、それはほぼ完全に質問とは無関係です。静的型付けは、変数名の左にいるタイプ名を必要としません。確かにそれは助けることができるが、それは言語設計者の選択ではない静的型付け言語の必要な特徴です。
これらは、F#などの他の静的型付けの言語を考慮することによって、容易に証明可能です。 F#でのタイプは、変数名の右側に表示され、非常に多くの場合、完全に省略させることができます。いくつかのカウンタの例もあります。たとえば、PowerShellは非常に動的であり、含まれている場合、左側に、そのタイプのすべてを置きます。
主な理由の 1 つは、割り当ての左側の型が左側の型 (またはその型に実装されているインターフェイス) の親型である限り、異なる型を指定できることです。
たとえば、次のタイプがあるとします。
class Foo { }
class Bar : Foo { }
interface IBaz { }
class Baz : IBaz { }
C# を使用すると、次のことが可能になります。
Foo f = new Bar();
IBaz b = new Baz();
はい、ほとんどの場合、コンパイラは できた 代入から変数の型を推測します( var
キーワード) ですが、上で示した理由によりそうではありません。
編集: 順序として - C# の間 は 強く型付けされた重要な違い (この議論に関する限り) は、実際には、 静的に型付けされた 言語。つまり、C# コンパイラはコンパイル時に静的型チェックを行います。
アンダース・ヘルスバーグはそう言っ結局ので...
あなたは前に、[クラス名]を必要とします
IMyCoolInterface obj = new MyInterfaceImplementer();
MyBaseType obj2 = new MySubTypeOfBaseType();
など。あなたが明示的に型を指定したくない場合にも、単語「VAR」を使用することができます。
は、なぜ我々は、データ型を知っておく必要があります のクラスのインスタンスの前に?
あなたはしないでください! を右から左に読む。のあなたは、変数を作成し、変数は後で使用するために何であるかの種類ことを知っているので、あなたは、タイプセーフ変数に格納します。
あなたが実行時までエラーを受信しなかった場合のデバッグに悪夢になり、次のスニペットを考えてみます。
void FunctionCalledVeryUnfrequently()
{
ClassA a = new ClassA();
ClassB b = new ClassB();
ClassA a2 = new ClassB(); //COMPILER ERROR(thank god)
//100 lines of code
DoStuffWithA(a);
DoStuffWithA(b); //COMPILER ERROR(thank god)
DoStuffWithA(a2);
}
you'rはあなたが数または文字列と構文での新しいクラス()を置き換えることができ考えるときは、より多くの意味を行います。次の例では、少し冗長かもしれないが、それがあるように設計だ理由を理解するのに役立つかもしれません。
string s = "abc";
string s2 = new string(new char[]{'a', 'b', 'c'});
//Does exactly the same thing
DoStuffWithAString("abc");
DoStuffWithAString(new string(new char[]{'a', 'b', 'c'}));
//Does exactly the same thing
のC#、他の人が指摘したように、強く、静的に型付けされた言語です。
は、作成しようとしているタイプが何であるかを前もって示すことによって、あなたは不正な値を代入しようとすると、警告コンパイル時の受け取ります。あなたが誤ってそれを期待されていないメソッドにナンセンスを渡すときに、メソッドに受け入れるパラメータの前どのようなタイプを示すことによって、あなたは、同じコンパイル時の警告を受けます。それはあなたに代わって、いくつかのパラノイアのオーバーヘッドを削除します。
最後に、むしろうまく、C#(および他の多くの言語)は、率直に言って、あなたをトリップすることができますPHPがするのと同じばかばかしい、「それは意味がない場合でも、何にでも何かを変える」の考え方を、持っていませんそれが助けに比べ倍アップ。
C#は、強く型付けされた言語であるため、
のC#はC ++やJavaのような、強く型付けされた言語です。そのためには、変数の型を知っている必要があります。あなたはvarキーワードを経由してC#3.0でそれを少しごまかすことができます。これは、コンパイラが型を推論できます。
これは強く型付けと弱い型付けされた言語の違いです。あなたは変数の型を宣言する必要がありますので、C#(およびC、C ++、Javaの、ほとんどのより強力な言語が)強く型付けされます。
私たちは、これらの変数を保持することをデータのタイプを指定する必要があります。コンパイラは、私たちがデータでやっていることは、すなわち、ルールに従って、それに理にかなっていることを確認します。私たちは、例えば数店舗のテキストをすることはできません - コンパイラはそれを許可しません。
。int a = "fred"; // Not allowed. Cannot implicitly convert 'string' to 'int'
変数aはint型のものであり、それに値テキスト文字列は、コンパイラは、この文字列の変換のいずれかの種類を行うことができませんrules-を破るある「フレッド」を割り当てます。
C#3.0では、あなたは「VAR」キーワードを使用することができます - これは、変数の型はコンパイル時には何か動作するように、静的な型推論を使用しています。
var foo = new ClassName();
変数「FOO」「クラス名」がそれ以降のタイプであろう。
言及されていない一つのものはC#がCLS(共通言語仕様)に準拠した言語であるということです。これは、.NET言語は、他の.NET言語とinteropableであるためにに付着している一連のルールです。
だから、本当にC#のは、ちょうどこれらの規則に維持されます。
このMSDNの記事を引用します>CLSは充実して確保することができます 定義することで、言語の相互運用性 その開発者ができる機能のセット ワイドで利用できるようにするに頼ります さまざまな言語。また、CLS CLSのための要件を確立 コンプライアンス;これらはあなたが判断するのに役立ち マネージコードは、に準拠しているかどうか CLSと与えられたどの程度まで このツールは、開発をサポートしています CLSの機能を使用するコードを管理します。
あなたのコンポーネントが唯一のCLSを使用している場合 それが公開するAPIの機能 派生を含む他のコード( クラス)、コンポーネントが保証されています 任意のプログラミングからアクセスできるようにします CLSをサポートする言語。 CLSに準拠するコンポーネント ルールと使用のみの機能 CLSに含まれると言われています CLS準拠のコンポーネント
CLSの一部は、CTSある共通型システムでます。
それは、その後、CLI、ILASM / MSIL、CLR、BCL、FCL、
など、.NETでの多くのトンがありますあなたのための十分な頭字語ではない場合静的型付けも、コンパイラがより良い最適化を行うことができますし、特定のステップをスキップします。あなたが唯一の引数が異なる同じ名前の複数のメソッドや演算子を持つたとえば、オーバーロードのために取ります。動的言語を使用すると、ランタイムはベストマッチであるかを決定するために、各バージョングレードする必要があります。このような静的な言語で、最終的なコードは、単に適切な過負荷を直接指します。
静的型は、コードの保守及びリファクタリングを助けます。私のお気に入りの例では、多くのハイエンドのIDEの名前の変更特徴です。静的型付けのおかげで、IDEは確実にあなたのコード内の識別子のすべての発生を見つけることができる、とそのまま同じ名前で無関係の識別子を残しています。
それはまだか言及された場合、私は気付かなかったが、C#4.0はdynamic
キーワードVIA動的なチェックを紹介しています。私は確信しているけれども、それは必要がないとき、あなたがそれを避けたいと思います。
なぜC#が変数を作成するときにデータ型を指定するために私を必要とします。
なぜ私たちは、クラスのインスタンスの前にデータの種類を知っておく必要があるのですか?
私はほとんどの答えが参照されていないことを一つのことは、C#は、は、もともとの意味や他のものの間で「安全な」言語、「管理」およびこれらの目標の多くがそうであるように設計されたという事実だと思います静的/コンパイル時の検証可能性を経由して到着しました。変数のデータ型を知ることは、明示的に解決するために、この問題がはるかに容易になります。 1は、これまでの実行を許可することなく、可能性のあるエラー/望ましくない行動について、いくつかの自動化アセスメント(C#コンパイラではなく、JIT)を作ることができることを意味します。
自動化されたアルゴリズムは、それが実際に実行したときにコードが何をするかよりよく理解することができ、そうすることができますもしので、副作用としてその検証可能性はまた、あなたなど読みやすく、開発ツール、安定性を提供します:)
静的型付けは、コンパイラは、実行時ではないコンパイル時のチェックのいくつかの並べ替えを行うことができます。すべての変数は、静的タイプの特定や強い型です。 C#は強く確実に強く型付けされます。