たくのろじぃのメモ部屋

プログラミング(C#)の基礎やそれを応用した技術情報をメモしておくブログです。

【C#】WPFアプリケーション入門 #8 メソッド(関数)とフィールド(変数)

はじめに

前回はクラスについて扱いました。今までに関数や変数を扱ってきましたが、実はクラスを介していると名称が変わります。クラスや今回の内容を扱ってちょっとしたアプリを作ってみます。

お品書き

今回扱う内容です。

  1. メソッド
  2. フィールド
  3. クラスを使ったアプリ

1. メソッド

メソッドは関数と同じような意味です。しかし、C# (Java) ではどこから呼び出すかによって名称が変わります。作った関数がそのクラス内で、呼び出すのもそのクラス内であれば関数、呼び出すのが別のクラスだとメソッドとなります。ちょっと分かりにくいので例を示します。

class A
{
    private void ボタン処理(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(関数(3).ToString);
    }
    
    int 関数 (int x)
    {
        return x * 2;
    }
}

これは関数です。同じクラス内に属しており、同じクラス内から呼び出しています。この例だと 3 を代入しているので 2 倍されて 6 が出力されますね。
次はこちらです。

class Main
{
    Sub sub = new Sub(); // Sub クラスを使うおまじない
    private void ボタン処理(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(sub.関数(3).ToString);
    }
}

class Sub
{
    public int 関数 (int x)
    {
        return x * 2;
    }
}

これはメソッドになります。1度、別のクラスを介して呼び出しています。

ちょっと複雑ですが、同じ場所にあるかないかで違ってきます。これはオブジェクト指向という考え方につながるので頭の片隅に入れておくといいと思います。(後で説明します。)

察しの良い方は気づいているかもしれません。次に示すものは「そういえばメソッドじゃん!」となると思います。

MessageBox.Show();
.ToString();
int.Parse();

そうです。これらはメソッドの仲間です。メッセージボックスはメッセージボックスに関するクラスが用意されています。その中でもメッセージを表示させるための Show() メソッドを用いています。
.ToString() は文字列、int.Parse() は int型に変換するためのクラス (正確には構造体) があり、たくさんの情報が詰まっています。つまり、この情報の塊の中にある関数 (外から見るとメソッド) を呼び出して使用していることになります。

ちなみに、もともとシステムで用意されているメソッドはVisual Studio にて Ctrl キーを押しながらそのメソッドをクリックすると、そのクラスを見ることができます。これをメタデータと呼びます。例えば変換するメソッドを見てみるとこんな感じになっています。

f:id:takunology:20190705234810p:plain

これがあるおかげで、楽に実装できるわけです。

2. フィールド

外部から呼び出す関数をメソッドと呼びますが、それと同じように外部から呼び出す変数をフィールドといいます。なので、フィールドを参照すると言ったら、そのクラス内にある変数を指していると思ってください。ちなみに、クラス内で定義した変数をメンバ変数といいます。

プロパティを参照する場合は

class Main
{
    Sub sub = new Sub(); // インスタンス化
    private void ボタン処理(object sender, RoutedEventArgs e)
    {
        // subクラスの value フィールドを表示
        MessageBox.Show(sub.value.ToString);
    }
}

class Sub
{
    //メンバ変数 value
    public int value = 10;
}

これで Subクラスからメンバ変数 value を呼び出すことができます。ちなみに、Mainクラスで value の値を変更することもできます。sub.value = 5 とすれば Subクラスの value には5が代入されます。設定ファイルとしてクラスを扱うのも1つの手です。

3. クラスを使ったアプリ

人に関する情報を登録し、それを表示する簡単なアプリを作ってみます。用意するクラスは前回 #7 で準備した人間クラスを使います。

class Human
{
    public int 身長;
    public int 体重;
    public int 年齢;
    public string 名前;

    public int 年を取る(int x)
    {
        return x + 1;
    }
}

使用するコントロールは次の通りです。

  • Button 3つ
  • Label 4つ
  • Textbox 4つ

それぞれの設定は XAML を参考にしてください。

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="69,33,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" x:Name="height"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="69,72,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" x:Name="weight"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="69,109,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" x:Name="name"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="69,145,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" x:Name="age"/>
        <Label Content="年齢" HorizontalAlignment="Left" Margin="30,145,0,0" VerticalAlignment="Top"/>
        <Label Content="名前" HorizontalAlignment="Left" Margin="30,109,0,0" VerticalAlignment="Top"/>
        <Label Content="身長" HorizontalAlignment="Left" Margin="30,30,0,0" VerticalAlignment="Top" />
        <Label Content="体重" HorizontalAlignment="Left" Margin="30,69,0,0" VerticalAlignment="Top"/>
        <Button Content="登録" HorizontalAlignment="Left" Margin="37,188,0,0" VerticalAlignment="Top" Width="75" Click="登録"/>
        <Button Content="年をとる" HorizontalAlignment="Left" Margin="124,188,0,0" VerticalAlignment="Top" Width="75" Click="年をとる"/>
        <Button Content="情報開示" HorizontalAlignment="Left" Margin="214,188,0,0" VerticalAlignment="Top" Width="75" Click="情報開示"/>
    </Grid>
</Window>

デザイン画面はこんな感じになります。

f:id:takunology:20190707180454p:plain

MainWindow.xaml.cs はこんな感じです。

public partial class MainWindow : Window
{
    //クラスをインスタンス化(実体化)
    Human human = new Human();

    public MainWindow()
    {
        InitializeComponent();
    }

    private void 登録(object sender, RoutedEventArgs e)
    {
        // Human クラスの変数を設定する
        human.身長 = int.Parse(height.Text);
        human.体重 = int.Parse(weight.Text);
        human.年齢 = int.Parse(age.Text);
        human.名前 = name.Text;

        MessageBox.Show("人間データを登録しました。");
    }

    private void 年をとる(object sender, RoutedEventArgs e)
    {
        // Human クラスの年を取るメソッドを実行
        // 引数はテキストボックスから得た値
        human.年齢 = human.年を取る(human.年齢);
        MessageBox.Show("あれから1年が経った...");
    }

    private void 情報開示(object sender, RoutedEventArgs e)
    {
        MessageBox.Show($"身長:{human.身長} \n体重:{human.体重} \n名前:{human.名前} \n年齢:{human.年齢}");
    }
}

文字列の先頭に $ を付けて、文字列中に { 変数 } を入れるとその変数を表示させることができます。便利なので覚えておくといいかもしれません。どちらでも可です。

MessageBox.Show("身長" + human.身長 + "\n体重" + human.体重 + "\n名前" + human.名前 + "\n年齢" + human.年齢);

MessageBox.Show($"身長:{human.身長} \n体重:{human.体重} \n名前:{human.名前} \n年齢:{human.年齢}");

できたら実行してみます。試しにデータを登録して年を取らせ、もう一度情報開示をしてみると...

f:id:takunology:20190707180936p:plain

こんな感じになると思います。

終わりに

クラスとフィールド、メソッドの使い方は変数と関数のように扱えます。ただ、外部から呼び出す場合は少しだけ挙動が変わります。今の状態ではどんなデータにも手を出すことができますが、あることをすると、制限することができます。