プロパティ
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クラスのページを見てみましょう。
↓をクリック。
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
}
}
最終更新:2009年11月23日 18:47