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メソッドについてのお話でした。今日はこの辺で。