ラベル mainの引数 の投稿を表示しています。 すべての投稿を表示
ラベル mainの引数 の投稿を表示しています。 すべての投稿を表示

2018年2月19日月曜日

mainメソッドの引数 ん?そもそもmainメソッドって何?

今回はmainの引数の話を書きます。

mainの引数


C言語の時代からmainという関数はプログラムの最初に走る関数である、という位置づけの関数でした。その引数は、プログラムを起動する際にコマンドラインから入力されるパラメーターをプログラムに渡すためのものでした。

これはC#でも変わらないのですが、C/C++とC#では書き方が変わっています。

C/C++の場合

int main( argc, argv )
int argc;
char *argv[];
{
・・・
}
もしくは、
int main( int argc, char *argv[] )
{
・・・
}

ここで、argcには引数の数が入り、argv[]は引数が単語に分割されて入っている配列となります。ちなみにargv[]は、正確には文字列へのポインタの配列です。


これに対して、C#では
int main( string[]  args )
{
・・・
}
という書き方になります。argsはstring型の配列です。また、argcはありませんね。C#では、配列には配列要素の数を返すLengthというプロパティがあって、これを参照すると配列に要素がいつく入っているのか簡単に知ることが出来ます。argsの場合だとargs.Lengthです。

したがって、argcがなくても全然困りません。

using System;

namespace argvtest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("args.Length=" + args.Length );
        }
    }
}

このようなテストコードを書いて確かめてみると、args.Lengthで引数の数が取得できているのが分かります。(下記にて、mcsはC#コンパイラーです)

MacBook-Pro:argvtest gustav$ mcs Program.cs 
MacBook-Pro:argvtest gustav$ mono Program.exe
args.Length=0
MacBook-Pro:argvtest gustav$ mono Program.exe aaa
args.Length=1
MacBook-Pro:argvtest gustav$ mono Program.exe aaa bbb
args.Length=2
MacBook-Pro:argvtest gustav$ mono Program.exe aaa bbb ccc
args.Length=3
MacBook-Pro:argvtest gustav$ mono Program.exe aaa bbb ccc ddd
args.Length=4
MacBook-Pro:argvtest gustav$ 

なお、Cで同じような記述をしてみると、以下のようになります。
#include  <stdio.h>

int main( int argc, char *argv[] )
{
    printf( "argc=%d\n", argc );
}

これの実行結果は以下の通りです。

MacBook-Pro:argc-test gustav$ cc -o argc-test argc-test.c
MacBook-Pro:argc-test gustav$ ls
argc-test       argc-test.c
MacBook-Pro:argc-test gustav$ ./argc-test
argc=1
MacBook-Pro:argc-test gustav$ ./argc-test aaa
argc=2
MacBook-Pro:argc-test gustav$ ./argc-test aaa bbb
argc=3
MacBook-Pro:argc-test gustav$ ./argc-test aaa bbb ccc
argc=4
MacBook-Pro:argc-test gustav$ ./argc-test aaa bbb ccc ddd
argc=5

Cでは、自分自身も数に入れて数えるので、C#のプログラムに対して1大きな数になっています。

というわけで、C#ではmainの引数の書き方が変わりました。

mainメソッドって何?


C言語の時代にはクラスというものが言語仕様になかったので、ユーザーが書いたプログラムの中で一番最初に実行される関数がmain関数というのがmainの位置づけでした。mainは関数でした。

C++の時代になっても、mainは相変わらず関数として記述されます。その辺の事情はこの記事に色々と書いてあります。どのクラスにも属さないグローバル関数ということのようです。

C#では、マイクロソフトのドキュメントによれば、一連の手続き(メソッド)は必ずクラスの中に記述されるとのことなので、その考え方に基づくとmainもクラスの中で定義されているメソッドということになります。昔読んだC++の教本にあった表現だと、クラスのメンバー関数、とも言えるのでしょうか。

そういうことで、mainメソッドって何?という問いに対しては、C#ではC/C++のようなグローバル関数を持つことが出来ず、クラスのメソッドとして定義するから、mainメソッドなんだよ、というのが答えです。

今日は、mainの引数のお話と、mainメソッドについてのお話でした。今日はこの辺で。