第12回 C#入門 C#プログラミングでstaticを扱ってみよう!
今回は静的メソッド、静的プロパティ、静的クラスについて説明致します。C#にはstaticキーワードを使って定義することができる。静的メソッド、静的プロパティ、静的クラスというものがあります。staticの特徴はインスタンスを生成しなくてもよい点です。イメージとしては、staticの場合は型ではなく実態そのものが生成されているというイメージです。今まではクラスという型があり、それを利用したい場合はインスタンスをし実態化、つまりオブジェクトにさせる必要がありました。staticはインスタンスする必要がなく、その実態そのものだというイメージです。
ここで全部staticでいいじゃないかと思われる方がいるかもしれません。
しかし、全てスタティックにしてしまいますとクラスの特徴である複数のオブジェクトを生成することができなくなってしまいます。
ですので、時と場合によって使い分ける必要があるのです。
それでは実際にプログラムを確認してみましょう。
using System;
namespace Program
{
class Sample
{
static void Main(string[]args)
{
Console.WriteLine("welcome");
var car1 = new Car();
var car2 = new Car();
car1.CarType = "PORSCHE";
car2.CarType = "LEXUS";
car1.WriteLine();
car2.WriteLine();
}
}
class Car
{
public static int CarNumber { get; set; }
public string CarType { get; set; }
public void WriteLine()
{
Console.WriteLine("CarNumber:{0}",CarNumber);
Console.WriteLine("CarType:{0}", CarType);
}
}
}
このように記載して見ます。
最初に静的メンバーの定義の仕方はこのように記載します。
static 型名 フィールド名
今回ですとCarクラスのpublic static int CarNumber { get; set; }がスタティックで宣言されています。では順番に説明していきますと、SampleとCarという2つのクラスがあります。CarクラスではプロパティとしてCarNumberとCarTypeがあります。そしてWriteLineというメソッドがあり、その中でCarNumberとCarTypeの値を画面に出力しています。順番前後しましたがプログラムはMainメソッドからスタートしますので、まずwelcomeが出力されます。次に今まで通りCarクラスのインスタンスを生成しCarTypeのみそれぞれPORSCHEとLEXUSという別の値を入れておきます。その後にそれぞれのオブジェクトでWriteLineメソッドを実行します。
試しにこれで実行しますと
このようにcar1のオブジェクトではCarNumberは0、CarTypeはPORSCHE、car2のオブジェクトではCarNumberは0、CarTypeはLEXUSと出力されました。ここまでは今まで通りですが、ここで試しにこのスタティックで宣言されているCarNumberに値を入力したいと思います。
試しにこのように記載して見ます。
car1.CarNumber = 1010;
これで実行して見ますと
エラーが出力されました。
冒頭でも説明しましたが、スタティックというのはインスタンスを生成する必要がありません。
逆を言いますとインスタンスを生成することができません
つまり、今回の場合ですと車番号(CarNumber)はオブジェクトを作成することができず、
実態そのものが生成されているというイメージです。
ですのでこのようにcar1.CarNumberと記載してしまいますと車番号(CarNumber)のオブジェクトはありませんのでエラーが発生しました。
少しまとめますと、車(car)というクラスがあります。
ここで、車というクラスをインスタンスさせ、それぞれPORSCHEという製品(car1)とLEXUSという製品(car2)を作成しました。
本来であれば、別々の車ですのでプロパティなど値は異なります。
しかしスタティック宣言とすることで、共通の車番号のプロパティを宣言することができるというイメージです。
ここでstaticで宣言されたプロパティに値を代入したい場合はこのように記載します。
クラス名.プロパティ名=値;
static void Main(string[]args)
{
Console.WriteLine("welcome");
var car1 = new Car();
var car2 = new Car();
car1.CarType = "PORSCHE";
car2.CarType = "LEXUS";
//↓↓↓追加
Car.CarNumber = 1010;
//↑↑↑追加
car1.WriteLine();
car2.WriteLine();
}
これで実行して見ますと。
このように出力されました。CarNumber は実態そのものですので、共通した値が出力されていることが確認できます。ここで注目して欲しいのがスタティックで宣言されたプロパティに値を代入したい場合クラス名.プロパティ名=値;で記載することです。是非皆さんも実際に記載して体感して見てください。次に静的クラスについて説明させて頂きます。と言っても、ほとんど同じですが、静的クラスを宣言した場合は当然、インスタンスでオブジェクトが生成できませんので、クラスの中身は必ず全てスタティックで宣言しなければなりません。実際にプログラムを見ていきましょう。今回はまずこのCarクラスをstaticで宣言して見ます。
このように記載します。
using System;
namespace Program
{
class Sample
{
static void Main(string[]args)
{
Console.WriteLine("welcome");
var car1 = new Car();
var car2 = new Car();
car1.CarType = "PORSCHE";
car2.CarType = "LEXUS";
Car.CarNumber = 1010;
car1.WriteLine();
car2.WriteLine();
}
}
//↓↓↓変更
static class Car
//↑↑↑変更
{
public static int CarNumber { get; set; }
public string CarType { get; set; }
public void WriteLine()
{
Console.WriteLine("CarNumber:{0}",CarNumber);
Console.WriteLine("CarType:{0}", CarType);
}
}
}
これで実行しますと
エラーが発生していますよね、これは先ほども言いましたがクラスがstaticで宣言されていますのでオブジェクトが生成できなくなります。なので中身も当然staticで宣言しなければなりません。正しくはこのように記載します。
using System;
namespace Program
{
class Sample
{
static void Main(string[]args)
{
Console.WriteLine("welcome");
//↓↓↓変更
Car.CarType = "PORSCHE";
Car.CarNumber = 1010;
Car.WriteLine();
//↑↑↑変更
}
}
static class Car
{
public static int CarNumber { get; set; }
//↓↓↓変更
public static string CarType { get; set; }
public static void WriteLine()
//↑↑↑変更
{
Console.WriteLine("CarNumber:{0}",CarNumber);
Console.WriteLine("CarType:{0}", CarType);
}
}
}
これで実行しますと
このようにポルシェの車のみ生成できるようになりました。今回は静的プロパティと静的メソッドと静的クラスについてということでstaticの考え方の説明から、実際にstaticを用いて車クラスを扱って見ました。staticの特徴では、インスンタスを生成しないことでしたね。次回の講座ではコンストラクタについての内容となっていますので是非ご覧ください。
以上で、C#入門を終了と致します。ご静聴ありがとうございました。 (๑╹ω╹๑ )
コメント