フィードバック結果
聴衆について
これについて多くのコメントがあったので、私は最後の試みをすることにしました。 コメントでフィードバックをお願いします-「みんなのため」かどうかが判明しました。
本について
コメントを読んだ後、私はそこで推薦された本のリストを公開することにしました:
C#2008。クラッシュコース
C#経由のCLR
C#および.NETプラットフォーム
C#2.0 完全なガイド
その他について
モノの速度について質問がありました。 先日、小さなテストがあるリンクを見つけました。 geekswithblogs.net
テストは以前のバージョンで実施されましたが、状況は世界的に変わっていないと思います。 私見
それでは、トレーニングを続けましょう...
複合型
C#では、使用可能な単純型に基づいて独自の複合型を定義できます。 プリミティブと同様に、複合型は参照および値によって型に分類できます。
値によるタイプ
構造
C#では、構造体はクラスの特別なタイプです。 構造はスタックに配置されるため、クラスよりも効率的に作成およびコピーできます。 小さな構造を考えてみましょう:
public struct Subscriber { public long SubID; public string FirstName; public string LastName; public string MiddleName; public decimal Balance; }
public struct Subscriber { public long SubID; public string FirstName; public string LastName; public string MiddleName; public decimal Balance; }
public struct Subscriber { public long SubID; public string FirstName; public string LastName; public string MiddleName; public decimal Balance; }
public struct Subscriber { public long SubID; public string FirstName; public string LastName; public string MiddleName; public decimal Balance; }
public struct Subscriber { public long SubID; public string FirstName; public string LastName; public string MiddleName; public decimal Balance; }
public struct Subscriber { public long SubID; public string FirstName; public string LastName; public string MiddleName; public decimal Balance; }
public struct Subscriber { public long SubID; public string FirstName; public string LastName; public string MiddleName; public decimal Balance; }
public struct Subscriber { public long SubID; public string FirstName; public string LastName; public string MiddleName; public decimal Balance; }
ある構造から別の構造にコピーする必要がある場合は、等号を付けてください。 1つのSubscriberオブジェクトSub1を作成し、フィールド値を設定しましょう。 その後、すべてのフィールドの値をある構造から別の構造Sub2にコピーします。
- サブスクライバーSub1;
- サブスクライバーSub2;
- //構造を初期化し、フィールドに入力します
- Sub1 = 新しいサブスクライバー();
- Sub1.FirstName = " Bob " ;
- Sub1.LastName = "Pupkin" ;
- Sub1.MiddleName = "Someone" ;
- Sub1.Balance = 100;
- //そして、1行で1つの構造の内容を別の構造にコピーします
- Sub2 = Sub1;
構造体は値による型ですが、 newを使用したことに注意してください。 オペランドnewを呼び出す前に、構造体へのアクセスのみが可能です。
構造はコピーに加えて、関数呼び出しをより正確にします。
あなたがCまたはC ++の第一人者である場合、注意してください-彼らは変わっています! C / C ++では、クラスと構造の唯一の違いは、プライベートではなくパブリックであったことです。
C#の構造は、メンバーがデフォルトでプライベートであるという事実だけでなく、構造のインスタンスとクラスのインスタンスがメモリ内の異なる場所にあるという事実だけでなく、まったく新しいおもちゃです。
構造体はクラスのほとんどの機能をサポートできますが(実装の継承はサポートしていません)、慎重に使用する必要があります。 構造は、小さなオブジェクトを提供するのに最適です。
乗り換え
列挙は、ユーザーが定義する整数型です。 列挙を宣言するとき、列挙インスタンスで受け入れられる有効な値のセットを指定します。 さらに、直感的な名前に値を割り当てる必要があります。
今後の作業では、転送は非常に重要な役割を果たし、プログラマーの生活を楽にします。 リストは次のように宣言されます。
- パブリック 列挙型 DaysOfWeek
- {
- 月曜日= 0、
- 火曜日= 1
- 水曜日= 2
- 木曜日= 3
- 金曜日= 4
- 土曜日= 5
- 日曜日= 6
- }
ここでは、曜日に対応する整数値を使用します。 特定の曜日へのアクセスは、次のようにして取得できます。DaysOfWeek.Wednesdayは2を返します。通常、転送は、対応する値をメソッドに渡す必要がある場合に使用されます。 切り替えについては後ほど詳しく説明しますが、ここでは例を見てみましょう。
- クラスプログラム
- {
- static void Main( string [] args)
- {
- WriteText(DaysOfWeek.Sunday);
- Console .ReadLine();
- }
- 静的 void WriteText(DaysOfWeek日)
- {
- スイッチ (日)
- {
- case DaysOfWeek.Monday:
- Console .WriteLine( "月曜日は厳しい日です!" );
- 休憩 ;
- ケース DaysOfWeek.Tuesday:
- Console .WriteLine( "火曜日-月曜日がすでに過ぎていることを意味します!" );
- 休憩 ;
- ケース DaysOfWeek.Wednesday:
- Console .WriteLine( "Wednesday!Midweek!" );
- 休憩 ;
- //など...
- }
- }
- }
参照によるタイプ
クラス
クラスは、C#および.NETプラットフォームのユーザー定義型のメインです。 ほとんどすべてのプログラムには、プログラムへのエントリポイントであるMain()メソッドを含む少なくとも1つのクラス(理論的には、クラスの代わりに構造体を使用できます)があります。
クラスは、データメンバーと関数を含む複合データ型です。 クラスには、ネストされたデータ型も含まれます。 1つの「バケット」を通してクラスについて詳しく説明します。 =)
インターフェース
C#のインターフェイスには、実装のない抽象要素のみが含まれます。 これらの要素の実際の実装は、このインターフェイスから派生したクラスに含まれている必要があります。
C#インターフェイスにはメソッド、プロパティ、インデクサーを含めることができますが、たとえばJavaとは異なり、定数値を含めることはできません。
たとえば、インターフェイスにメソッドが含まれている場合は機能しますが、メソッドを実装するためのコードはその中にありません。
デリゲート
デリゲートは、メソッドを参照する型です。 これらはC ++の関数ポインターに似ていますが、クラスをインスタンス化し、静的メソッドとクラスの特定のインスタンスのメソッドの両方を呼び出すことができます。
初心者にとって、複雑さを掘り下げるのは時期尚早なので、名前を覚えておいてください-私たちは彼らに戻ります。
配列
配列は、データの編成方法を定義します。 配列は、同じタイプの要素の順序付けられたコレクションです。 配列の各要素には、要素の順序を決定するインデックスがあります。 インデックスの数は、配列の次元を特徴づけます。
C#では、他の多くの言語と同様に、インデックスは整数型で指定されます。
C#では、配列の静的文字に関するC ++言語の重要な制限が削除されました。 C#の配列は、真の動的配列です。
配列宣言
1次元配列の宣言方法を検討してください。
1次元配列の宣言
一般的な広告構造:
[<属性>] [<修飾子>] <タイプ> <名前>;
今のところ属性と修飾子を忘れてください。 1次元配列の宣言は次のとおりです。
<タイプ> [] <名前>;
C ++とは異なり、角括弧は変数名ではなく型に割り当てられることに注意してください。 これらはクラス定義の不可欠な部分であるため、T []という表記は、クラス、T型の要素を持つ1次元配列として理解する必要があります。
- //配列宣言
- int []整数。
これは配列宣言の例です。 newを使用して配列を初期化することもできます。
- // 32個のint値の配列を作成します
- int [] Integers = new int [32];
配列要素にアクセスするための通常の構文は次のとおりです。
- 整数[0] = 24;
C#では、配列を初期化せずに作成できるため、プログラムの実行中にサイズを変更できます。
- int []整数。
- 整数= new int [32];
C#の配列は、C / C ++のように、中括弧でリストされた値を初期化する機能を保持していました。
- string [] Privet = { "one" 、 "two" 、 "three" };
- //これは同等です
- string [] Privet = new string [] { "one" 、 "two" 、 "three" };
ただし、落とし穴があります! たとえば、配列のサイズを設定するには、変数を使用できません。
- int len = 3;
- //コンパイルされていません
- string [] Privet = new string [len] { "one" 、 "two" 、 "three" };
- / *ただし、定数を使用できます* /
- const int len = 3; //これは定数です
- //そしてコンパイルする
- string [] Privet = new string [len] { "one" 、 "two" 、 "three" };
アレイを使ってどんな面白いことができますか?
配列の長さを調べる:
- int Dlina = Massiv.Length;
- // ToString()-intから文字列に変換します
- Console .WriteLine(Dlina.ToString());
並べ替え:
- //配列はパラメーターとしてSort()メソッドに渡されます
- Array.Sort(Massiv);
再注文:
- //配列はパラメータとしてReverse()メソッドに渡されます
- Array.Reverse(Massiv);
などなど...
本で多次元配列について自分で読むことをお勧めします。
だから今日は十分だと思う。 信じられないかもしれませんが、HabrRedactorでこの(類似の)記事を印刷した後、ブラウザが何かをオフにし、それを保存することができなかったという事実のために、私は1日を逃しました。 私は非常に怒って寝ました。 感情...