9_プロパティ staticメンバ


プロパティ

using System;

class Rectangle{
    int tate,yoko;

    public Rectangle(int t,int y){    //コンストラクタ
        tate = t;
        yoko = y;
    }

    public int Tate{    //プロパティの名前は大文字から
        get{
            return tate;
        }
        set{
            if(value > 0){    //0以下の値は拒否
                tate = value;
            }
        }
    }

    public void Show(){
        Console.WriteLine("tate:" + tate.ToString() + " yoko:" + yoko.ToString());
    }
}

class MainClass{     //メインクラス開始
    static void Main(){
        Rectangle ra = new Rectangle(2,7);
        ra.Tate = 6;    //setのほうを呼ぶ。valueには6がセットされます。
        Console.WriteLine("tate:" + ra.Tate.ToString());  //getのほうを呼ぶ。
    }
}

プロパティの部分はpublic int Tateの部分です。
今までだと
RectangleクラスにgetTate(int t);をつくり
MainクラスでgetTate(6);
みたいにしてセットしてたけど
ra.Tate=6;のほうが直感的に操作できるし便利です。
valueが0より多くないとセットされないことに注目してください。
こうすれば
ra.Tate=-100
みたいな変な値を拒否できます。安全です。
でもこのまま何も言わず拒否するだけじゃあんまりなので
0以上を入力してください!とか表示しましょう!
プロパティが = の左側にあったらsetが呼ばれる
そうじゃないときgetが呼ばれる
ことに注意しよう。
あと、必ずこうしなきゃダメってことじゃないですが
プロパティ名は最初が大文字なのがスタンダード。
public int tate{
    get;set;
}

もうちょっと応用(?)してみましょう。
単位が違うけど同じ内容みたいなのをやってみよう
(1メートルと1000ミリメートルとか、60秒と1分は同じとか)
using System;

class Nagasa{
    double mm;

    public double MM{     //ミリメートル
        get{
            return mm;
        }
        set{
            if(value<0.0){
                Console.WriteLine("0以上を入力してください");
            }else{
                mm=value;
            }
        }
    }

    public double M{    //メートル
        get{
            return mm/1000.0;    //1メートル=1000ミリ
        }
        set{
            if(value<0.0){
                Console.WriteLine("0以上を入力してください");
            }else{
                mm=value*1000.0;
            }
        }
    }
}

class MainClass{
    static void Main(){

        Nagasa na = new Nagasa { M = 2.0 };    //前回やった書き方です。
        Console.WriteLine("メートル:{0} ミリメートル:{1}",na.M, na.MM);
        na.MM = 2048.0;
        Console.WriteLine("メートル:{0} ミリメートル:{1}",na.M, na.MM);
        na.M=-100.0;   //マイナスを入れてみます
        Console.WriteLine("メートル:{0} ミリメートル:{1}",na.M, na.MM);
    }
}

メートルに2をいれたらミリメートルが2000に
ミリメートルに2048を入れたらメートルが2.048になったと思います。
内部はdouble mmだけしかないのに二つの変数を持ってるみたいにできます。

次は読み込みだけってのをやってみましょう。

using System;
class Test{
    public int Zero{
        get{ return 0;}
    }
}

class MainClass{
    static void Main(){
        Test t = new Test();
        //t.Zero=100;とやるとエラーが出ます
        //エラー	プロパティ(略)は読み取り専用
        Console.WriteLine("{0}",t.Zero);
    }
}
こんな風にgetだけにすると読み込みだけしかできなくなります。

staticメンバ

インスタンス変数とかインスタンスメソッドってのはnewしないと使えない変数です。
これはいいでしょう。
ちなみにメンバってのは変数とかプロパティとかメソッドとか
コンストラクタなどのクラスの中に入ってるデータたちです
メンバにstaticをつけるとnewしないでも使えます。
以前6_クラスのラストでちょっとだけ書いてたけど
Console.WriteLineとかいままでnewしなかったでしょ。
あれはWriteLineがConsoleクラスのstaticメソッドだったから。
Consoleクラスのページを見てみましょう。
↓をクリック。

MSDNのConsoleメンバページ

Consoleメンバっていうページで
パブリックプロパティって書いてて
表の左の欄のほとんどに
Sって書いてるマークあるでしょ。これがStaticなプロパティや
メソッドであるというマークです。
Console.WriteLineにもSがついています。newしなくても使えるってことです。

せっかくだしちょっと一番最初にあるBackgroundColorプロパティ使ってみよう。
間違いやすいかもしれないけどBackGroundColorじゃないよ。groundだよ。
    using System;
    class MainClass
    {
        static void Main()
        {
            Console.BackgroundColor = ConsoleColor.Blue;    //Blueに設定
            Console.WriteLine("背景が青いです");
        }
    }

こういったの利用してMSDOSやコマンドプロンプトで絵描いてる人もいるらしい・・・

さて動画のプログラム
using System;

class Rectangle{
    public static int tate;    //static publicでもいいです。
    public static int yoko;

    public Rectangle(int t, int y){
        tate = t;
        yoko = y;
    }

    public void Show(){
        Console.WriteLine("tate:" + tate.ToString() + " yoko:" + yoko.ToString());
    }
}

class MainClass{
    static void Main(){    //もちろんここにもstatic
        Rectangle ra1 = new Rectangle(2,7);
        Rectangle ra2 = new Rectangle(5,9);

        Rectangle.tate=10;
        Rectangle.yoko=30;

        ra1.Show();
        ra2.Show();
    }
}

staticなのでnewしないでもtateとyokoが使えます。
普通、staticな変数ってのは数学のπ(円周率)
とかe(指数対数でやるネイピア数)
みたいな定数を読み取り専用(constなど)にして使ったり
ほとんどクラスから独立してnewする意味がなさそうなメソッド
(Console.WriteLineとか、sin関数とかlog関数とか)
に使います。
最初のうちはstaticはどんな時に使うのかよくわからんと思うけど
とりあえずnewしなくても使える
とだけ覚えとけばいい。


using System;

class Rectangle{
    public static int tate;
    public static int yoko;

    public Rectangle(int t, int y){
        tate = t;
        yoko = y;
    }

    public static void Show(){
        Console.WriteLine("tate:" + tate + " yoko:" + yoko);
    }
}

class MainClass{
    static void Main(){

        Rectangle.tate=10;
        Rectangle.yoko=30;

        Rectangle.Show();
    }
}

今回の内容とは関係ない話

型キャスト

今まで特に型は意識してませんでした。
特にdoubleとかintとか。
あまり意識しないで代入しまくるとどうなるか
ちょっと試してみましょう。
using System;
class Test{
    static void Main(){
        int i=1; double d=5.3;
        d=i;          //int型をdouble型に入れてます
        Console.WriteLine("{0}",d);
    }
}

ちゃんと、「1」という表示が出ます。
じゃ逆

using System;
class Test{
    static void Main(){
        int i=1; double d=5.3;
        i=d;          //さっきと逆
        Console.WriteLine("{0}",i);
    }
}
doubleをintに暗黙的に変換できません
とかいわれて実行できないはずです。
こういう風に、型の違うものを何も書かず=でつなぐことを
暗黙変換といいます。
暗黙変換はなるべく避けたほうがいいです。
i=dはできるのにd=iは無理とかわかりづらいしょ。
今はint型とdouble型しかやってないけど
実はもっとたくさん数値の型があっていちいち
暗黙変換がどうとかいわれてエラーになったらうざいから
面倒でもできる限りちゃんとはっきり「int型に変換します」って宣言しましょう。
using System;
class Test{
    static void Main(){
        int i=1; double d=5.3;
        i=(int)d;          //dをはっきりとint型に変換してる
        Console.WriteLine("{0}",i);
    }
}
(int)をつけると、その数字をint型にキャスト(変換)できます。
この際、double型を整数になおすと小数以下切捨てです。負の数も同じ。
四捨五入とか変なこと考えずとりあえず切り捨て!
例 (int)4.9→4、(int)-10.8→-10
今のところは、double→intにする際は(int)をつけなきゃいけないことだけ
覚えててください。
あとは型を変換する機能をもったクラスとして
Convertクラスがあります。
もちろんこんなの使う際にnewすると不便なのでstaticです。
MSDNのConvertメンバページ
パブリックメソッドのToInt32を見てください
int型は正式名称(別名?)がInt32なのでToInt32って書いてます
オーバーロードの一覧で、いろいろな型(特に数字に関係しそうなもの)
がオーバーロードされてます。
Convertクラスを使うのは(int)ってつけるのとほとんど変わらないですが
四捨五入されたり微妙に違うので覚えておくと役に立つかも。
using System;
class Test
{
    static void Main()
    {
        int x=5; double y=10.6;
        x = Convert.ToInt32(y);
        Console.WriteLine("{0}", x);   //(int)と違って10.6→11
    }
}

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2009年11月23日 18:47