C# 初級講座
VB2015 VB2017 VB2019 Visual Studio 2022

第7回 引数と戻り値

2022/4/24

この記事が対象とする製品・バージョン

Visual Studio 2022 Visual Studio 2022 対象です。
Visual Studio 2019 Visual Studio 2019 対象です。
Visual Studio 2017 Visual Studio 2017 対象ですが、.NET Frameworkで試してください。
Visual Studio 2015 Visual Studio 2015 対象ですが、.NET Frameworkで試してください。
Visual Studio 2013 Visual Studio 2013 対象ですが、.NET Frameworkで試してください。 $から始まる補完文字列は扱えません。
Visual Studio 2012 Visual Studio 2012 対象ですが、.NET Frameworkで試してください。 $から始まる補完文字列は扱えません。
Visual Studio 2010 Visual Studio 2010 対象ですが、.NET Frameworkで試してください。 $から始まる補完文字列は扱えません。
Visual Studio 2008 Visual Studio 2008 対象ですが、.NET Frameworkで試してください。 $から始まる補完文字列は扱えません。
Visual Studio 2005 Visual Studio 2005 対象ですが、.NET Frameworkで試してください。 $から始まる補完文字列は扱えません。
Visual Studio.NET 2003 Visual Studio.NET 2003 対象外ですが参考にはなります。
Visual Studio.NET 2002 Visual Studio.NET (2002) 対象外ですが参考にはなります。
  Visual Studio Code 対象外ですが参考にはなります。

 

目次

 

1.静的メソッドを使う

1-1.静的メソッドをいろいろ呼び出してみる

フレームワークの機能はすべてクラスまたは構造体のメンバーを呼び出すことで使用できます。

簡単に呼び出せる静的メソッドをいくつか呼び出して、フレームワークの機能を使ってみましょう。

下記の設定で新規プロジェクトを作成してください。

プロジェクトテンプレート Windows フォーム アプリ
プロジェクト名 CallMemberLesson
ソリューション名 CallMemberLesson
フレームワーク .NET 6.0

 

フォームにボタンを1つ配置してClickイベントハンドラーを使って次のようにプログラムしてみましょう。

もし、Windows フォーム アプリ や Click イベントハンドラーのことがわからなければ入門講座第4回 イベントを逃すなを見てみてください。

namespace CallMemberLesson
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //クリップボードに「あいうえお」をコピーします。右クリック「貼り付け」できるようになります。
            Clipboard.SetText("あいうえお");

            //電卓を起動します。
            System.Diagnostics.Process.Start("calc.exe");

            //新しいフォルダーを作成します。
            Directory.CreateDirectory(@"C:\test\newfolder\子フォルダー");

            //196の平方根を取得します。
            double root = Math.Sqrt(196);
            MessageBox.Show($"196の平方根は {root} です。");

            //キーボードのNumLockが押されているかを取得します。trueの場合、押されています。
            bool isNumLocked = Control.IsKeyLocked(Keys.NumLock);
            if (isNumLocked)
            {
                MessageBox.Show("NumLockが押されています。");
            }
            else
            {
                MessageBox.Show("NumLockは押されていません。");
            }

            //500を16進数で表記した値を取得します。1f4 になります。
            string hexValue = Convert.ToString(500, 16);
            MessageBox.Show($"500を16進数で表記すると {hexValue} です。");
        }
    }
}

何が起こるかはコメントにも書いておきましたが、少し補足しておきます。関係のない6個の機能が順番に実行されます。

クラス
(読み方)
メソッド
(読み方)
機能
イベントClipboard
   (クリップボード)
イベントSetText
   (セットテキスト)
クリップボードに文字列をセットします。
テキストが入力できる場所で、マウスを右クリックして貼り付けなどするとその文字列を貼り付けられます。
イベントProcess
   (プロセス)
イベントStart
   (スタート)
指定されたプログラムまたは関連付けられたプログラムを実行します。
calc.exeは電卓のファイル名です。
イベントDirectory
   (ディレクトリー)
イベントCreateDirectory
   (クリエイトディレクトリー)
フォルダーを作成します。
\ が \t などのエスケープシーケンスにならないように @" " と組み合わせるのが楽です。
参考:入門講座 第6回 文字・数値・日付のあつかい
イベントMath
   (マス)
イベントSqrt
   (エスキューアールティー
   または スクウェアルート)
平方根を計算します。
イベントControl
   (コントロール)
イベントIsKeyLocked
   (イズキーロックド)
キーボードのキーがロックされているか調べます。
この例ではNumLockキーがロックされているかを判定してます。
イベントConvert
   (コンバート)
イベントToString
   (トゥーストリング)
数字の引数を2つ指定する Convert.ToString(500, 16)のような使い方は、500を16進数で表現した文字列にするという意味です。第2引数には2, 6, 10, 16だけが指定できます。

 

Process.Start と Control.IsKeyLocked はもう少し補足しておきます。

 

1-2.Process.Start

Process.Start メソッドは、指定されたプログラムを実行するか、または関連付けられたプログラムを実行します。ここでは calc.exe を指定して電卓を起動しています。calc.exe は電卓の本体です。

Windowsではあらかじめ設定されたフォルダーに入っているファイルは、フォルダー名を指定しなくてもアクセスすることができます。calc.exeが入っている C:Windowsフォルダーもそのようなフォルダーの一つなので、ここでは "C:\Windows\calc.exe" と書く代わりに、単に"calc.exe"とだけ書くことができます。

この「あらかじめ設定されたフォルダー」はWindowsの環境変数の PATH で確認できます。

参考:【Windows 11対応】Path環境変数を設定/編集して、独自のコマンドを実行可能にする:Tech TIPS - @IT (itmedia.co.jp)

 

Process.Startにプログラムでないファイル、たとえば C:\xxxx\xxxx.txt のようなファイルを指定すると、そのファイルに関連付けられた既定のアプリを使ってそのファイルを起動してくれます。たとえば、拡張子 .txt のファイルなら通常はメモ帳が起動します。フォルダーを指定すると、エクスプローラーでフォルダーが開きます。このように Process.Start は簡単に使えるうえになかなか使い勝手の良いメソッドです。

 

ただ、Processクラスが属する名前空間 System.Diagnostics はWindowsフォームアプリで既定で省略可能な名前空間ではないので、この例のように名前空間付きで記述するか、Importなどを使って省略可能な名前空間に追加する必要があります。Importなど名前空間については別途説明する予定です。

 

2.Control.IsKeyLocked

2-1.bool

Control.IsKeyLockedメソッド の近辺のプログラムは少し特徴的で説明することが多いので章を改めました。

IsKeyLockedの行で登場する変数 isNumLocked は bool というデータ型(読み方:bool=ブール)になっています。これは論理型とも呼ばれます。 bool型は2つの値しか取れません。原理的にはその2つの値とは 0 または 1 のことです。使い道には OKなのかNGなのか、YesなのかNoなのか、オンなのかオフなのか、などのような2つのうちどちらかしかない状態を表すのに使います。この2つの状態を C# では Yes や No ではなく、true または false と表現します(読み方:true=トゥルー、false=フォルス)。true の方が OK, Yes, オンのように肯定的な意味を表し、falseの方が、NG, No, オフのような否定的な意味を表します。(とはいえ、int や string 同様、その値がどのように機能に影響するかはプログラム次第です。)

true と false はそのまま C# のキーワード(予約語)としてプログラムに記述することもできます。

ここでは IsKeyLockecdメソッドを使って、キーボードのNumLockキーが押されているかを調べています。結果、NumLockキーが押されている場合、変数 isNumLockec は true になり、そうでない場合は false になります。キーのロックはあまり使用する人が以内と思うのでピンと来ないかもしれませんね。一番よく使うのは CapsLockキーでしょうか。これがロックされている状態だと半角英語の入力が基本大文字になります。

 

2-2.if

そして、その下の if 文で if (isNumLocked) と書いている意味は、もうご想像できるかと思いますが、isNumLocked が ture であるかどうかを判断するものです。この if 文は == を使って次のように書いても同じ意味です。

if (isNumLocked == true)
{
    …
}

この書き方の方が 「もし、isNumLockec が true なら」という日本語にあてはめて理解しやすいので初心者は好む傾向にあるようですが、こういう書き方をするのは初心者だけです。(私のレビューしたプログラムにこのように書いてあったら、私はそのプログラマーの経験値を疑います。本当に。)

どういうことかもう少し掘り下げてみましょう。

== という演算子は等しい場合に true を返し、等しくない場合には flase を返す働きをします。

次のプログラムで x が 5 になるのは + 演算子の機能だと直感的に理解できますよね。

// + 演算子が計算され 5 になり x に代入される。
int x = 2 + 3;

== も演算子なので、(学校で習わないので直感的には理解できませんが) 結果が bool型であるという違いはありますが + と同じように機能するのです。

// == 演算子が計算され false になり y に代入される。
bool y = 2 == 3;

つまり、たとえば、 if (value == 5) という if 文があれば、次のように記述しても同じです。

bool z = value == 5;
if (z)
{
    …
}

これを if (z == true) と書きたければ、これは true == true または false == true を実行することになるので結果としては同じ機能になりますけど、無意味です。書くとしたら不慣れな初心者が少しプログラムの意味をわかりやすくする目的くらいでしょうか。

== の他に比較演算子には != と > や < それに <= と >= がありますが、これらはどれも == と同じように true/false を返します。

 

2-3.Keys 列挙型

Control.IsKeyLockecの行は説明すべきことが多いです。次はかっこの中の Keys.NumLock に注目してみます。


bool isNumLocked = Control.IsKeyLocked(Keys.NumLock);

結論から言うと Keys (読み方:Keys=キーズ)は列挙型です。入門講座第5回 メソッドとプロパティ でも列挙型の説明をしています。

前述したようにControl.IsKeyLockedメソッドは、キーがロックされているかどうか調べる機能です。

一般的なキーボードにはロック可能なキーが3つあります。CapsLockキーと NumLockキーと ScrollLockキーです。

このどれの状態をしらべるかをかっこの中の引数で指定します。

このときに、昔のプログラムなら、それぞれに数字を割り当てて 1 なら CapsLock 、2なら NumLock などと事前に決めておいて、Control.IsKeyLocked(2) などと書いたり下かもしれませんが、これだとあまりにもわかりにくいので、数字を名前付きの定数を割り当ててグループ化したものが列挙型です。この列挙型は Keys という名前が付けられているので、Keys. と入力することで、他にこのグループに属している定数にどのようなものがあるのか簡単に確認することもできます。列挙型は定数をグループ化しているだけであり、それ以上の機能はありません。

実際のところプログラマーにわかりやすいように Keys.NumLock という記述になっていますが、これの実体は 144 という数値です。でも、C# のコンパイラーは賢くて、Control.IsKeyLocked(144) というように直接144という値を指定するエラーになります。ここでは Keys列挙型が使いましょうということです。こうすることで、誰かが書いた Control.IsKeyLocked(144) というプログラムの意味がわからなくて苦しくぬことがなくなります。

 

3.練習問題

3-1.クラスはどれか?

さて、少し力試しを兼ねて理解度チェックをしてみましょう。

さきほどのプログラムを見てクラスがどれか見分けることができるでしょうか?見分けることができないとこのあとの説明がすんなりとは理解できないかもしれません。

このプログラムの中でクラスをすべて選択してください。クリックすると色が変わるようになっています。全部クリックできたと思ったら「回答する」ボタンを押してみてください。

先に1つだけ言っておきます。 string はクラスです。ですから、 string は必ずクリックしてくださいね。

//クリップボードに「あいうえお」をコピーします。右クリック「貼り付け」できるようになります。
Clipboard.SetText("あいうえお");

//電卓を起動します。
System.Diagnostics.Process.Start("calc.exe");

//新しいフォルダーを作成します。
Directory.CreateDirectory(@"C:\test\newfolder\子フォルダー");

//196の平方根を取得します。
double root = Math.Sqrt(196);
MessageBox.Show($"196の平方根は {root} です。");

//キーボードのNumLockが押されているかを取得します。trueの場合、押されています。
bool isNumLocked = Control.IsKeyLocked(Keys.NumLock);
if (isNumLocked)
{
    MessageBox.Show("NumLockが押されています。");
}
else
{
    MessageBox.Show("NumLockは押されていません。");
}

//500を16進数で表記した値を取得します。1f4 になります。
string hexValue = Convert.ToString(500, 16);
MessageBox.Show($"500を16進数で表記すると {hexValue} です。");

 

3-2.確認問題

問1.指定したファイルを実行するには何を使いますか?
Clipboard.SetText
Process.Start
Math.Sqrt
Convert.ToString
問2.true または false を表現する型はどれでしょうか?
int
string
double
bool
問3.次のプログラムで 変数 isOld は何型ですか?
if (isOld) {
    MessageBox.Show("古いです。");
}
int
string
double
bool

 

4.引数と戻り値

4-1.引数を知る

メソッドを呼び出すときにどのような引数をいくつ指定する必要があるのかはVisual Studioが教えてくれます。

たとえば、Clipboard.SetText( まで入力すると次のようにいろいろなヒントが表示されます。

ヒントを日本語化していない人はこちらを参考に日本語化できます。→ 入門講座 第9回 開発環境になれよう

この中でグレーになっている部分はAIからの提案なので場合により表示内容が異なるかもしれません。この機能はIntelliCodeと呼びます。

今回注目してほしいのはヒントに表示されているかっこの中に (string text) と表示されているところです。

これはかっこの中に string型の 値がひとつ入りますよ という意味です。さらに、ヒントの一番下には「text: クリップボードに追加するテキスト」とまで表示されていて、この引数の意味まで教えてくれています。

 

それから、左側に表示されている 1/2 は、引数の入力の仕方(オーバーロード)が2つあり、今ヒントで表示しているのはそのうち1つめであるということを表しています。

引数の入力の仕方が1つしかない場合、ここには何も表示されません。

入力候補の一覧が表示されている場合 Esc で閉じてからキーボードの ↑ ↓ を押すか、マウスで▲ ▼をクリックすると別の入力方法のヒントを表示します。

 

Clipboard.SetTextメソッドの場合、2つ目のオーバーロードは次のヒントになります。

みると、引数が1つ増えており、2つの引数を指定する方法があることがわかります。2つ目の引数は TextDataFormat型という見慣れない型です。実際ほとんど見かけることはないでしょう。

ちょっとわかりにくいのですが最初の引数 string text が太字になっている点にも注目してください。これは今入力すべきなのは1つ目の引数であるということを示しています。1つ目の引数を何か入力してカンマを入力すると、今度は TextDataFormat formatの方が太字になり、一番下のヒントにはこの引数のヒントが表示されます。

 

4-2.戻り値を知る

メソッドが返す値のことをメソッドの「戻り値」(もどりち)または「返り値」(かえりち)と呼びます。

戻り値についてもVisual Studioのヒントに情報が表示されています。

この位置です。

ここに void (読み方:void=ボイド)と表示されている場合は、戻り値はありません。

 

Math.Sqrt の場合は、この位置に double と記載されています。これで戻り値の型が double であるとわかります。

だから、先ほどのプログラムでは double 型の変数 root を宣言した戻り値を受け取っています。

//196の平方根を取得します。
double root = Math.Sqrt(196);

なお、キーワード var を使って root の型を Visual Studio の推論させることも可能です。この場合 Sqrtメソッドの戻り値が double 型であるので、変数 root はやはり double 型になります。

//196の平方根を取得します。
var root = Math.Sqrt(196);

 

4-3.リファレンスを確認する

引数や戻り値も含め、メソッドの説明はリファレンスに掲載されています。

「リファレンス」という言葉にはいろいろな意味がありますが、ここではマニュアルや説明書・ヘルプのような意味です。

リファレンスを確認するもっとも簡単な方法は、Visual Studioで対象のキーワードにテキスト入力のカーソルがある状態で F1 キーを押すことです。

ちょっと説明しにくいのですが、この画像では、Convert.ToStringメソッドの ToString の t と r の間にテキスト入力のカーソルがあります。

この状態で F1 を押すとブラウザーでConvert.ToStringメソッドのリファレンスが表示されます。

ヘルプの使い方については入門講座も参考にしてください。→ 入門講座第8回 ヘルプの使い方

このToStringメソッドはオーバーロードが36個もあります。ここで使っているのは数値を2つ引数に指定するオーバーロードです。このように表示されると思います。

URLはここです。

Convert.ToString メソッド (System) | Microsoft Docs

2つの引数の意味や戻し値について説明してありますし、少し下に行くとプログラム例やもっと細かい説明も記載されています。

ただ、表記がちょっとわかりにくいですね。「Int32」というのはC#のintのことです。フレームワークの視点ではC#のintとはInt32という構造体なのです。だから、間違っているわけでは二のですが、C#のヘルプを表示しているのだから C#の表記で統一してくれたらもっとわかりやすいのになと思います。なお、publicはこのメソッドをどこからでも呼びがせることを示し、static はこのメソッドが静的メソッドであることを示しています。

 

4-4.練習問題

EnvironmentクラスのExitメソッドを呼び出そうとしたところ、次のようなヒントが表示された。このヒントとプログラムから読み取れることをすべて選択してください。

引数が1個必要
第1引数はint型
Exitは非静的メソッド
戻り値はint型
オーバーロードなし

 

 

 

次の回では、非静的メソッドを扱います。

C#初級講座講座 次の回へ