C#初心者のためにわかりやすくプログラムの書き方を解説する講座

当サイトではアフィリエイト広告を利用しています。

C#初級プログラミング

この講座はまったくC#をやったことがない,プログラムを1行も書いたことがない!という人にも解るように,C#プログラミングを徹底的に解説しています。

C#とは

C#というのはマイクロソフトが開発した言語で,
およそ15年前にできた言語です。
文法自体はjavaに近い書き方となります。
この言語を覚えるだけでWindowsのディスクトップアプリ,
Webの開発が可能になります。
最近ではUWPやXamarinに対応したおかげで,
Windows10が動く環境ならどこでも動作する(UWP)や,
アンドロイド,iPhoneでも動作するアプリケーションも
作れるようになりました。

開発環境はVisualStudioというものを使い,
比較的便利な環境での開発ができるようになっています。
(2003年当時からするとだいぶ使いやすくなりました。)

C#を書く環境を作る

C#を使うためには、VisualStudioおイストールする必要があります。
現在は無料でインストールできるようになっていますので,
インターネットから取得して,インストールを行ってください。
ダウンロードとインストールで数時間かかると思います。

https://www.visualstudio.com/ja/vs/community/

既にVisualStudioをインストール済の方は
そちらを使用していただいて問題ありません。
本書では初歩的な文法のみを取り上げますので,
VisualStudioは2008以降のものであれば問題ありません。
本書ではVisualStudio 2017 Communityを使用します。

プロジェクトの作成

VisualStudioをインストールしたら起動してみましょう。
こんな感じの初期起動画面になると思います。

 

「ファイル」「新規作成」「プロジェクト」を選択します。

 

「Windowsクラシックデスクトップ」
「Windowsフォームアプリケーション(.NET Framework)」を選択し,
場所には任意のパスを指定します。
プロジェクト名とソリューション名は今回は変更せずに
「OK」をクリックします。

 

こんな画面が出てくると思います。

これはWindowsフォームを作成する画面のプログラムになります。
今回はこの画面に対してプログラミングを行いながら,
勉強をしていきたいと思います。

画面起動と基本的な設定

「ソリューションエクスプローラー」の「Form1.cs」を右クリックして,
「コードの表示」を選択します。

 

「ソリューションエクスプローラー」が表示されていない場合は
ツールメニューの「表示」より
ソリューションエクスプローラーを選択して表示してください。

 

次のようなプログラムコードが表示されると思います。

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}

上のほうにある

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

これらの部分は現時点では気にする必要はありません。
プログラムコードを書く範囲は次の
class Form1の中カッコの範囲内という事になります。

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }

public Form1(){}の部分はコンストラクタという部分で,
このクラスが生成されるときに,
一番初めに動作する部分になります。
クラスとは変数と関数のひとかたまりの型の事ですが,
現時点ではプログラムの一つのかたまりと思っておいてください。
class Form1 と最初に書かれている通り,
このクラスはForm1というクラスで,
コロン:の後にFormと記述されていることにより,
「.NetFramework」の画面のクラスを継承しているという意味になります。
このため,このクラスは最初に表示されていた
グレーの画面が表示されるプログラムになっています。

難しいことはさておき,
要するにこのForm1クラスは画面を表示できる
クラスというプログラムになっています。
このクラスに処理を書くことで,
自由に画面の動作をプログラミングできるようになります。

 

画面の起動

それではこのプログラムを実行してみましょう。
画面上部のツールバーから「開始」を選択して実行しましょう。

 

するとこんな画面が表示されます。

 

タイトルがForm1になっています。
そのほか右側に最小化,最大化,閉じるボタンの3つの機能がついています。
これは特に何もしなくても表示されます。
消したい場合は消せますが,今回はこのままにしておきます。
「×」ボタンで一度画面を閉じましょう。するとプログラムが停止します。

 

タイトルの変更

それではタイトルの「Form1」の部分を違う言葉に変えてみましょう。
デザイン画面でプロパティの「Text」の入力エリアに
「プロパティで変更」と入力してみましょう。

 

この状態で実行してみましょう。

画面のタイトルが変更されているのがわかります。
それではまた「×」で閉じましょう。

 

今度はコード画面より「コードで変更」と入力してみましょう。
デザイン画面で右クリックメニューから「コードの表示」を選んで
次のコードを書きましょう。

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.Text = "コードで変更"; //変更箇所
        }
    }

「this」は自分自身を表しています。この場合は画面です。
「Text」は画面のタイトルの部分の値になります。
イコールでつないでダブルコーテーションで囲んで,
文字を設定しています。
文字を表すときは必ずダブルコーテーションで囲みます。
イコールを書くと,右の値を左の項目に設定するという意味になります。
こういったイコールで値を入れることを代入といいます。
最後はコードの最終を表すセミコロン「;」を書きます。
C#では複数行に改行するコーディングが行えるので,
コードの最後を示す「;」セミコロンが必要です。
あと,C#では大文字と小文字を区別しているため,
正確にコーディングする必要があります。

 

これでタイトルに「コードで変更」という文字が表示されます。
試しに実行してみましょう。

コードの位置を変えてみましょう。

    public partial class Form1 : Form
    {
        public Form1()
        {
            this.Text = "コードで変更"; //変更箇所

            InitializeComponent();
        }
    }

InitializeComponent()の前に移動しました。
この状態で実行してみましょう。

「プロパティで変更」と出ました。
何が起きているのでしょうか?

「プロパティで変更」はデザイン画面のプロパティウィンドウで変更しました。
この変更はInitializeComponent()の中で実行されているという事になります。
画面のプロパティはInitializeComponent()で実行されるため,
これより前にコード上で変更しても,
上書きされてしまうので注意してください。
コード上で行う画面プロパティの変更はInitializeComponent()の後に
コーティングするようにしましょう。

 

画面上にいろいろなコントロールを置くことができますが,
今回は文法に関して解説を行うため,
画面には何も置かずに解説を続けます。

 

変数

変数とは何かわかりますか?
変数とは値を入れておく入れ物と思ってください。
例えば「int」という変数を使うと,
4バイトの整数を入れることができます。
この入れ物の事を変数と呼び,
入れ物の種類の事を「型」(カタ)と呼びます。

「型」はいろいろありますが,
基本的には覚える必要があります。
例えば「整数」「小数部のある値」「文字」「画像」などです。
数値だけでもいろいろな型がありますが,
最初は簡単な整数型と文字型を使ったプログラミングをしてみましょう。

【int】「イント」と呼びます。
整数の入れ物になります。
C#ではマイナス20億からプラス20億までの値を扱うことができます。
これだけの値を扱えるのでC#で整数を扱うときはよく使います。
それでは使ってみましょう。

こんな感じで書きます。

public Form1()
{
    InitializeComponent();
    int intValue;
   intValue = 5;
    this.Text = intValue.ToString();
}

まず「int intValue;」は宣言といわれるものです。
intをintValueという名前で使いますよーという事を表しています。
そのあと,「intValue = 5」の部分はintValueという入れもに,
数値の「5」を入れますという意味になります。

「this.Text = intValue.ToString();」この部分は前回の
タイトルの代入と同じ喜記述になります。
this.Textに値を入れています。
ただ,this.Textは文字を入れるいれものなので,
int(整数)を入れることができません。

C#では基本的には同じ型の代入しかできません
this.Textの「Text」のあたりにカーソルをかざすと,
次のようなポップアップ表示がされると思います。
「string Form.Text{get;set;}」と書いています。
初めて見る人は意味が分からないと思いますが,
「string」というのは文字列を表しており,
Form.Text(つまり,今回であればthis.Text)は
文字型であるという事を示しています。

型が異なると代入ができないので,
intを文字型に変更する必要があります。
それを実現するための処理はすでに
「.NetFrameWork」に実装されており,
それを呼び出すだけでOKです。

それが整数の変数に「.ToString()」を付けることで可能になります。
要するに「this.Text = intValue.ToString();」は
タイトルにintValueを文字に変換した値をいれて!
という意味になります。

この状態で実行するとintValueは5なので
タイトルに「5」が表示されるはずです。
実行してみましょう。

これで整数の使い方がわかったので,
整数の計算なんかもできるようになります。
次のようにすると今度は画面のタイトルに10と表示されますね。

public Form1()
{
    InitializeComponent();

    int intValue;
    intValue = 5;
    intValue = intValue * 2; //変更箇所
    this.Text = intValue.ToString();
}

これまで,変数は「int」と「string」を紹介しましたが,
変数はまだほかにもいろいろとあります。
long short byte bool float double decimal long,short,byteは
どれも整数を格納するためintと同じですが,
扱える範囲が異なります。

byte,short,int,longの順に大きな値が扱えます。
1バイト,2バイト,4バイト,8バイトの順に増えていきます。
バイト数だけ見ると倍になっていますが,
扱える範囲は飛躍的に変わります。

byte

0 ~ 255

符号なし 8 ビット整数

short

-32,768 ~ 32,767

符号付き 16 ビット整数

int

-2,147,483,64 ~ 2,147,483,647

符号付き 32 ビット整数

long

-9,223,372,036,854,775,808 ~9,223,372,036,854,775,807

符号付き 64 ビット整数

bool型はTrueかFalseのどちらかを表します。
トゥルーとフォルス(フォールス)と発音します。
ONとOFFのような感じで,ONがTrue,OFFがFalseとなります。
取りうる値が2種類しかない場合に使います。
例えばエラーがあったかどうか?といった判断なんかで使います。
書き方はこんな感じです。

bool isError = false;

floatとdoubleは小数を扱うときに使います。
振動値が1.23m/s2という場合はこんな感じで書きます。

float vibrationValue = 1.23f;

最後のfはfloat型をあらわしていて,
float型として数値を代入する場合は,
数値の後にfと記載します。
floatとdoubleの違いは4バイトか8バイトかの違いになります。
floatが4バイト,doubleが8バイトになります。

decimalは数値を扱う型ですが,
計算時に誤差が出ない型といわれています。
通用は金額計算などに使います。
これと対照に,多くの小数部を使う場合はdoubleを使うとよいでしょう。
その代わりdoubleやfloatは多少の誤差が出ます。
天文学的な計算に適しています。

代入

値の代入のやり方を見ていきましょう。

int型の変数を宣言して値を代入するには次のように書きます。

int value;
value = 10;   

ただ,これは昔の書き方で,通常は1行で変数の宣言と値の代入は同時に行います。

int value = 10;

どちらも同じ意味ですが,2行にするのは冗長なので1行で行きましょう。 その他の型も基本的には同じ書き方をします。

まず「型」を書いてその次に「任意の名前」(大文字と小文字は区別されることに注意してください),「=」イコールでつないで右辺に「代入したい値」の順で書きます。

if文の書き方

if文の書き方を見ていきましょう。
これは結構な頻度で書きますので,確実に覚えておきましょう。

if文は何かを判断するときに使用します。

int value = 10;     

if(value == 10)
{
    Console.WriteLine("OK");
}
else
{
    Console.WriteLine("NG");
}

1行目はint型に10を代入しています。
そのあとのif文では「もしvalueが10ならOKと表示,
それ以外ならNGと表示」というプログラムになります。

書き方はまずifと書きます。
そのあとに続く( )の中に判断する条件を書きます。
同じ値かどうかを判断するときは
イコール2つを連続で書きます「==」。
イコール以外にも,
大小関係を比較する場合は
大なり小なり「>」「<」「<=」「>=」などが使えます。

条件文の次の{}に条件が成り立った時の処理を書きます。
そのあとelse{ }に成り立たなかったときの処理を書けます。
else以降が不要な場合は省略できます。
また,複数の条件がある場合は
else ifキーワードで続けて書くことができます。

int value = 10;     

if(value == 10)
{
    Console.WriteLine("OK");
}
else if(value == 11)
{
    Console.WriteLine("OK11");
}
else
{
    Console.WriteLine("NG");
}

順番は最後にelseが来るようにして,
それ以外はelse ifで複数の条件を記述することができます。

繰り返しを処理するforeach文の書き方

foreach文に関しては別記事になっているのでこちらからどうぞ

foreach文を使って配列やListを処理する方法(break,continue)
foreachとはループをさせる構文ですが配列やListなどを全件ループさせる時に使用します。

関数とは?

関数とは複数の箇所から呼び出し可能な処理のひとかたまりです。
例えば「実行」ボタンが押下されたときと,
キーボードで「F12」キーを押したときの動作が同じだった場合,
それぞれの処理に同じ処理を入れると処理が重複し,
コードが多くなるし,修正が必要になった時に,
すべての箇所で正しく修正が出来るかどうかが難しくなり,
非常に見通しの悪いコードになります。

そういった場合は関数にします。
ちなみにC#をしている方は関数をメソッドと呼んでいます。
メソッドは次のように書きます。

private void Execute()
{
    Console.WriteLine("実行しました");
}

この場合,「実行」ボタンを押下しても,
「F12」を押しても「Execute()」を呼び出すことで,
処理を共通化できます。

「private」は同一クラスからのみ呼び出し可能を表します。
「void」は値の戻り値がないことを表しています。

戻り値とは,処理をした後に値を返すことです。
メソッドは値を返すものと返さないものの2つに分かれていて,
返さないときは「void」と明示的に示します。

値を返す場合は返却する型を記述します。

private int Sum(int a, int b)
{
    return a + b;
}

この例ではint型を返しています。
aとbを足した値を返却しています。
値を返すときは必ず値を返す必要があります。

クラスとは?

クラスとは値とメソッドのひとかたまりです。
値はintやstringなどを学びましたね。
他から呼び出すことのできる処理です。

C#はオブジェクト指向言語と呼ばれる言語なので,
処理をできるだけ細かくクラスというものに細分かして,
各クラスが独立して値とメソッドを管理します。

なぜそんなことをするかというと,
その方がわかりやすくて,修正とか機能追加がしやすい,
他の人が見ても理解しやすい,などのメリットがありますが,
初心者の方には非常に難しい話になると思います。

私もオブジェクト指向を理解するまでには時間がかかりました。
とりあえずクラスは「値」と「メソッド」のひとかたまりと
覚えておいてください。

それでは実際にクラスを作成してみましょう。
「プロジェクト」右クリックで「追加」の「新しい項目」を選択します。

「クラス」を選択して「名前」を「Sum」にして「追加」を押下します。

 

これで,プロジェクトに「Sum」クラスが追加されました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApp1
{
    class Sum
    {
    }
}

いま,Sumクラスはこのような感じになっています。
最初のusing5行はおまじないとおもって無視してください。
「namespace」は階層分けのためにあるのでこれもとりあえず無視します。   class Sum{}の部分がクラスの定義になります。

class Sum
{
}

今は作成したばかりなので,定義は何もありません。
ではここに値と処理を入れてみましょう。

class Sum
{
    public int ValueA;
    public int ValueB;

    public int ReturnValue()
    {
        return ValueA + ValueB;
    }
}

これで,値と処理が入りました。
「public」は外部から参照できることを示します。
外部から値を変えたり参照したい場合は
「public」か「internal」を使用します。
「internal」は同一アセンブリからの参照が可能なのですが,
この場合同一プロジェクトと考えてください。

「public」はプロジェクトが異なっても参照可能です。
それなら全部publicでいいのでは?と思われるかもしれませんが,
publicの場合は外部に波及している影響範囲がわかりづらくなる
というデメリットがあります。

同一プロジェクトでしか使用しないのであれば,
Internalにすることで,例えばクラス名を変更した場合などは,
コンパイルエラーが発生するため,
コードの影響範囲がわかりやすくなります。

今回はpublicにしておきます。
publicのValueAとValueBがあります。
ReturnValueを呼び出すとValueAとValueBを足した値が返却されます。
これはただそれだけのクラスになります。

クラスの生成

とりあえずクラスができたのでクラスを使ってみましょう。
使い方はこんな感じになります。

Form1クラスから呼び出してみましょう。

Sum sum = new Sum();
sum.ValueA = 10;
sum.ValueB = 20;
int result = sum.ReturnValue();
Console.WriteLine(result);

「Sum sum = new Sum();」の部分で
Sumクラスのインスタンスを生成しています。

インスタンスとはクラスを使える状態にするという事です。
これから先クラスというのは使える状態にしないと
使えないことを覚えておいてください。

使える状態の事をインスタンスと呼んでいます。

クラスはインスタンスにしないと使えません。
インスタンスにするにはnewキーワードを使います。
新しいSumクラスをsumという名前で生成するという意味になります。

C#は大文字と小文字を区別するため,
このようにクラス名の頭文字を小文字にしてインスタンス名することが
多いです。

出来立てのSumクラスはValueAもValueBも初期値が入っています。
そのあとValueAとValueBにそれぞれ10と20の値を入れています。
SumクラスでValueAとValueBをpublicにしているため,
異なるクラスであるForm1クラスからも参照できます。

試しにValueAをprivateに変更すると見えなくなります。
興味のある方はお試しください。

ReturnValue()ではValueAとValueBを足した値が返却されますから,
resultには「30」が設定され,コンソールに30と表示されます。

これでクラスをインスタンスにするやり方と,使い方がわかりましたね。

「こんなクラスを作らなくてもForm1クラスにValueAとValueBとReturnValue()を書けばいいじゃないの?」と思われるかもしれませんが,
これには訳があります。

今回はAとBを足すという非常に単純な処理ですが,
「ValueAとValueBを足して消費税をかけて,
シルバー会員のときは10%OFFにする」
という仕様だった場合,各画面で処理を行うと,
いろんなところに同じようなメソッドが散らばる可能性があります。
その場合,仕様が変わって20%OFFとなった時,
あらゆるところを直さないといけなくなります。

それをSumクラスに処理を記載していれば,
Sumクラスの修正だけで済みます。
このようにオブジェクト指向では1つ1つのクラスに分けて,
専門的な処理をさせていきます。

消費税と20%OFFの概念を入れるとこんな感じになります。

class Sum
{
    private float _tax = 0.08f;
    private float _discount = 0.2f;

    public int ValueA;
    public int ValueB;

    public int ReturnValue()
    {
        var value = ValueA + ValueB;
        var taxValue = value * _tax;
        var discountValue = value * _discount;
        return Convert.ToInt32(value + taxValue - discountValue);
    }
}

クラスを作成することでディスカウントや消費税の概念が1か所に集まるので,
より良いコーディングなります。

コンストラクタとは?

先ほどValueAとValueBをpublicにして
Form1クラスから設定しましたが,
Sumクラスを生成する時点で値が判明しているのであれば,
クラス生成時に設定が可能です。

クラス生成時に動作する処理部分をコンストラクタと呼んでいます。

class Sum
{
    private float _tax = 0.08f;
    private float _discount = 0.2f;

    private int _valueA;
    private int _valueB;

    public Sum(int valueA,int valueB)
    {
        _valueA = valueA;
        _valueB = valueB;
    }

    public int ReturnValue()
    {
        var value = _valueA + _valueB;
        var taxValue = value * _tax;
        var discountValue = value * _discount;
        return Convert.ToInt32(value + taxValue - discountValue);
    }
}

public Sum(int valueA,int valueB)の部分が
コンストラクタといわれる部分です。

publicの後にvoidや戻り値の型を書かずに,
クラス名を書くとコンストラクタになります。

引数のvalueA,valueBはSumクラス生成時に指定する必要がる
引数という意味になります。
この部分に値を設定してクラスのインスタンスを生成します。

publicで宣言していたValueAとValueBがprivateの
_valueA,_valueBになっていることに注目してください。

コンストラクタで値を設定することで,
外部からの設定が不要になり,
publicをprivateに変更できました。

これで_valueA,_valueBはこのクラスでしか使用しない
非常に見通しのよい変数になりました。

クラスの中の変数をprivateにして外部から参照できないようにする
プログラミング手法を「カプセル化」と呼びます。

C#の慣例でprivate変数は頭文字小文字,
開発チームによってはアンダーバーを付けることがよくあります。
この変更により呼び出し元のForm1は次のようになります。

Sum sum = new Sum(10, 20);
int result = sum.ReturnValue();
Console.WriteLine(result);

Sumをnewするタイミングで値を設定しています。
これでSumクラスは「消費税」と「割引率」という値と「それをどう計算するか」というメソッドが1つになったクラスとなり,大変意味のある機能となりました。これで画面が100画面あろうとSumクラスがいつも同じ計算をしてくれます。

以上でこの講座は終了となります。

最後までお読みいただきありがとうございました。