12.1 クラスとオブジェクト
コード内でオブジェクトを記述するには、オブジェクトのプロパティとメソッドを記述します。オブジェクトは可視かつ具体的でなければなりません。
例えば:
ランプ: プロパティとメソッドがあります
特性: 形状: 円形; 消費電力: 500w; 色: 白; ブランド: xx
メソッド: グロー
電動ファン: プロパティとメソッドがあります
属性: 形状: 3 つの葉、色: 白、ブランド: xx
方法: 回す、扇ぐ
さらに、これらのオブジェクトを同じ属性とメソッドでカプセル化し、「クラス」の概念を抽象化します。
クラスはオブジェクトのプロパティとメソッドを決定する描画であり、オブジェクトはクラスに基づいて作成されます。
クラスは建物を構築するための設計図であり、オブジェクトは構築される建物です。
12.2 クラス構文
[パブリック] クラス <クラス名>
{
フィールド (フィールド);
プロパティ(財産);
メソッド (メソッド);
}
属性とフィールドは、同じ要素の異なる名前です。フィールドはデータベースの観点から見た名前であり、属性とも呼ばれます。属性はオブジェクト指向の観点から見た名前です。
クラスを作成した後、キーワード new を使用してこのクラスのオブジェクトを作成する必要があります。このクラスを作成するプロセスをインスタンス化と呼び、this: はこのクラスの現在のオブジェクトを表します。クラスはメモリを消費しませんが、オブジェクトはメモリを消費します。
12.3 プロパティ
1 はじめに:
プロパティはフィールドの自然な拡張 です。命名という観点から見ると、フィールドはメモリ内のインスタンス オブジェクトのレイアウトに依存する傾向があります。属性は、現実世界のオブジェクトの特性を反映する傾向があります。属性の機能は、フィールドを保護し、フィールドの割り当てと値を制限することです。属性の本質は 2 つのメソッドであり、1 つは get と呼ばれ、もう 1 つは set と呼ばれます。
提案: データを公開するには常に (フィールドではなく) 属性を使用します。つまり、フィールドは常にプライベートまたは保護されます。
2) 文法:
パブリック戻り型識別子
{
get{ return Output value; } プロパティの値を取得するためのアクセサー
set { assign = value; } アクセサはプロパティに値を割り当てます
}
get と set の両方があり、これらを読み取り可能プロパティと書き込み可能プロパティと呼びます。
取得のみで設定はありません。これを読み取り専用属性と呼びます。
取得はなく設定のみであり、これを書き込み専用属性と呼びます。書き込み専用属性はめったに表示されず、機密データへのアクセスを制限するためによく使用されます。
カプセル化プロパティのショートカット キー: Ctrl+R+E
値設定(代入 )制限を行う場合はパラメータはvalueを使用し、値(出力値)制限を行う場合はパラメータはfieldを使用します。
例:
プライベート文字列名。
パブリック文字列名
{
get{名前を返す;}
セット{名前=値;}
}
3) 新しいキーワード:
人 zs 人 = 新しい人();
new は 3 つのことを行うのに役立ちます。
① メモリのスペースを空ける
② 開いた空間にオブジェクトを作成する
③ オブジェクトのコンストラクタを呼び出してオブジェクトを初期化する
4) このキーワード:
現在のクラスを表すオブジェクト。
このクラスのコンストラクターはクラス内で呼び出されます: this。
5) 属性の演習:同じ名前空間で、ユーザーによって割り当てられた名前、性別、年齢を決定する新しい Person クラスを作成します。性別が男性/女性として割り当てられていない場合、デフォルトは中です。年齢がそれより低い場合は、デフォルトは中です。 0 より大きいか 100 より大きい場合、デフォルトは 0 です。
//首先在Person类下封装属性,写方法:
public class Person
{
private string _name;
public string Name
{
//当你输出属性的值得时候 会执行get方法
get { return _name; }
//当你给属性赋值的时候 首先会执行set方法
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set
{
if (value < 0 || value > 100)
{
value = 0;
}
_age = value;
}
}
private char _gender;
public char Gender
{
get
{
if (_gender != '男' && _gender != '女')
{
return _gender = '中';
}
return _gender;
}
set { _gender = value; }
}
public void Say()
{
Console.WriteLine("我叫{0},我今年{1}岁了,我是{2}生,我 可以说话", this.Name, this.Age, this.Gender);
}
}
//再在Main函数实例化Person对象,并赋值:
class Program
{
public static void Main(String[] args)
{
Person p = new Person();
p.Name = "张三";
p.Age = 20;
p.Gender = '女';
p.Say();
Console.ReadKey();
}
}
操作結果:
私の名前は張三です。20歳です。女の子です。話すことができます。
12.4 コンストラクター
1) コンストラクターの紹介:
まずメソッド(関数)ですが、「構築」という機能を持っているのでコンストラクタ(構築メソッド)と呼ばれます。コンストラクターは、クラス と同じ名前のメンバー関数です。通常、クラス内のコンストラクターは、クラスのメンバー プロパティを初期化するために使用され、戻り値の型は含まれません。
機能:インスタンス オブジェクトの作成時に自動的に呼び出され、インスタンス オブジェクトを初期化できます。
なぜ初期化するのでしょうか?
1 つのクラスから多くのインスタンス オブジェクトをインスタンス化できますが、各オブジェクトはいくつかの属性を設定する必要があります。
次の方法で値を割り当てます。
オブジェクト1.プロパティ1 = 値1;
オブジェクト1.プロパティ2 = 値2;
オブジェクト2.プロパティ1 = 値3;
オブジェクト2.プロパティ2 = 値4;
多くのオブジェクトをインスタンス化する場合、多くの繰り返しコードが発生します。
したがって、コンストラクターを使用してオブジェクトを初期化し、オブジェクトが最初にインスタンス化されるときにそれを割り当てます。
次のように:
classNameObject1 = 新しいクラス名(値1, 値2)
classNameObject2 = 新しいクラス名(value3, value4)
簡潔でエレガントな
2) コンストラクターの構文要件:
パブリッククラス名([パラメータ])
{
コンストラクターコード。
}
知らせ:
① コンストラクターは、private ではなく public 修飾子を使用する必要があります。public: public と public で、どこからでもアクセスできます。private: private、このクラスを除く現在のクラス内でのみアクセスできます。
②コンストラクタはオブジェクトを作成する特殊な関数で、関数名はクラス名と同じで戻り値はなく、voidも書く必要がありません。
③ コンストラクタにはパラメータを持たせることができ、新しいオブジェクトを渡す際に関数のパラメータを渡すことができ、オブジェクトの作成(新規)時にコンストラクタが実行されます。
④ コンストラクタには戻り値がないため、関数名の前に void、int、string などの戻り値の型を付ける必要がありません。
⑤ コンストラクタは継承、オーバーライドできません。ただし、サブクラスは、base() を通じて親クラスのコンストラクターを呼び出すことができます。
⑥ コンストラクターはオーバーロードできます。コンストラクターを定義する必要はなく、システムは組み込みの空のコンストラクターを使用します。新しいコンストラクターを作成すると、それがパラメーターなしであるかどうかに関係なく、デフォルトのパラメーターなしのコンストラクターが削除され、クラス内に 3 つ以上のコンストラクターがある場合、それはオーバーロードされたコンストラクターと見なすことができます。
以下は空のコンストラクターです。
パブリッククラス名()
{
ここには何も書かない
}
オブジェクトをインスタンス化する場合、次の2 つの方法があります。
①パラメータなしのコンストラクタを呼び出してオブジェクトをインスタンス化します。
人 p1 = 新しい人();
②パラメータを指定してコンストラクタを呼び出し、オブジェクトをインスタンス化します。
People p1 = new People("Zhang San", 20, "Student");
3) コンストラクターの演習 1:
距離属性 (この属性は読み取り専用で、構築メソッドで割り当てられます) を負の値にすることはできず、読み取り専用の価格属性を持つチケット クラスを書き込み、価格 (1 元/km) を計算します。 ) 距離に応じて:
0~100キロメートルの運賃は割引されません
101~200km 合計15%オフ
201~300km 合計10%割引
総距離300キロ以上は20%割引
//首先写ticket类:
public class Ticket
{
private double distance;
public double Distance
{
get { return distance; }
}
//构造函数
public Ticket(double distance)
{
if (distance < 0)
{
distance = 0;
}
this.distance = distance;
}
private double price;
public double Price
{
get
{
if (distance > 0 && distance <= 100)
{
price = distance * 1.0;
return price;
}
else if (distance >= 101 && distance < 200)
{
price = distance * 0.95;
return price;
}
else if (distance >= 201 && distance < 300)
{
price = distance * 0.9;
return price;
}
else
{
price = distance * 0.8;
return price;
}
}
}
public void ShowTicket()
{
Console.WriteLine("{0}公里需要{1}元", Distance, Price);
}
}
//再在Main函数中调用有参数的构造函数实例化对象:
class Program
{
public static void Main(String[] args)
{
Ticket t = new Ticket(358);
t.ShowTicket();
Console.ReadKey();
}
}
出力結果:
358キロメートルは286.4元必要
4) コンストラクター演習 2: 4 つのデータ メンバー (名前、性別、年齢、学校、およびいくつかのメンバー関数)を含む Student クラスを作成します。同時に、このクラスを使用して生徒データの割り当てと出力を実現する main 関数を記述します。
要件: メンバー関数を使用してデータを出力し (学生の関連情報を表示)、コンストラクターを使用してデータを入力します (複数のコンストラクターをオーバーロードして使用できます)。
//首先在Student类中编写:
public class Student
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private string gender;
public string Gender
{
get { return gender; }
set
{
if (value != "男" && value != "女")
{
value = "中";
}
gender = value;
}
}
private int age;
public int Age//设为属性
{
get { return age; }//得到 return返回值
set //设置判断的条件,规定该属性的正确要求
{
if (value < 0 || value > 100)
{
value = 18;
}
age = value;
}
}
private string school;
public string School
{
get { return school; }
set { school = value; }
}
public void ShowStudent()
{
Console.WriteLine("该学生姓名为:{0},性别为{1}生,年龄为{2}岁,学校为{3}", Name, gender, Age, School);
}
public Student(string name, string gender, int age, string school)
{
this.Name = name;
this.Gender = gender;
this.Age = age;
this.School = school;
}
public Student(string name, string gender)
{
this.Name = name;
this.gender = gender;
}
}
//再在Main函数中实例化新的对象:
class Program
{
public static void Main(String[] args)
{
Student s1 = new Student("小丽", "女", 22, "南昌大学");
s1.ShowStudent();
Student s2 = new Student("张三","未知");
s2.ShowStudent();
Console.ReadKey();
}
}
出力結果:
学生の名前はXiaoli、性別は中学生、22歳、学校は南昌大学です。
生徒の名前は張三、性別不明、年齢は0歳、学校は
12.5 デストラクター
1) デストラクターの概要:
ガベージ コレクターが最終的にオブジェクトを破棄する前に呼び出される、デストラクターと呼ばれるメソッドを定義できます。プログラムが終了すると、リソースを解放するためにデストラクターが実行されます。デストラクターが記述されていない場合、GC (ガベージ コレクション ガベージ コレクター) が自動的にクリーンアップしてリソースを解放します。
どういう意味ですか?オブジェクトを作成するたびに、プログラムがオブジェクト内のコンストラクターを自動的に呼び出し、オブジェクトのメモリを動的に開くため、通常はコンストラクターを頻繁に使用します。しかし、メモリが使い尽くされていない場合にどうすればよいか考えたことはありますか? 空きメモリを再利用するためのリサイクル メカニズムが必要です。
C# には独自のガベージ コレクション メカニズムがあります。この「ゴミ」には空きメモリが含まれており、プログラマが手動でスペースを解放する必要はありません。自動的に行われますが、欠点が 1 つあります。これは自動的かつランダムであり、プログラムを実行するたびにリサイクルする必要はなく、気分によって異なります。
デストラクタはオブジェクトが破棄される前に実行される関数、つまりガベージコレクションが完了する前に呼び出される関数で、メモリを解放する前にデストラクタに記述して実現したい内容を記述することができます。
2) デストラクター構文:
~クラス名()
{
コード本体。
}
注意:デストラクタにはパラメータを含めることはできません。デストラクタには戻り値もアクセス修飾子もありません。デストラクタはシステムによって呼び出されます。デストラクタはオプションです。デストラクタはプログラムの終了時に呼び出されます。
リソースを解放する GC (Garbage Collection) ガベージ コレクター。