程序入口点Main函数:
1、Main第一个字母必须大写,返回值可以是void,也可以是int。
2、如果带命令行参数的话,格式如下:
void Main(string[] args)
多个命令行参数用空格隔开,如果命令行参数中带有空格,则该命令行参数用“”括起来。
3、必须是static函数。
因为Main函数是定义在一个类中,非静态函数必须通过对象来调用,Main是程序的入口点,此时没有创建任何对象。若要在Main中直接调用的函数也应该为static,因为类的static成员函数不能调用非static成员函数。

//static
static void TestStatic()


{

}

//非static
void TestNonStatic()


{

}

static void Main(string[] arg)


{
TestStatic(); //OK,直接调用static函数
TestNonStatic(); //error,不能直接调用非static函数

Test t = new Test();
t.TestNonStatic(); //OK,通过对象调用非static函数
t.TestStatic(); //error,不能通过对象调用static函数
Test.TestStatic(); //OK, 通过类命调用static函数
}
参数匹配:
1、优先调用参数类型完全匹配的函数。
2、当没有类型完全匹配的函数时,如果传入的参数类型可以隐式转换为函数参数类型时,也可以调用。
3、若传入的参数类型不能隐式转换为函数参数类型,则调用失败。
//long
static void TestPara1(long l)


{
Console.WriteLine("long");
}

//int
static void TestPara(int i)


{
Console.WriteLine("int");
}


static void Main(string[] arg)


{
TestPara(4); //调用TestPara(int i);若没有定义TestPara(int i), 则调用TestPara(long l)
TestPara(4l); //调用TestPara(long l);若没有定义TestPara(long i), 则error
}
可变参数:
1、使用params关键字修饰函数的最后一个参数,且只能修饰最后一个参数,该参数类型必须为数组。
2、调用该函数时,参数则可以不确定。
//可变参数
static void TestPara(string name, params int[] i)


{
Console.WriteLine("int");
}


static void Main(string[] arg)


{
TestPara("nh", 1, 2, 3);
}
值参数和引用参数:
1、使用ref修饰的参数为引用参数,可改变传入参数的值。
2、传入的值参数或引用参数,必须是初始化过的。
3、函数调用时,也需要在引用参数前面加ref关键字。
//值参数和引用参数
static void TestPara(int i, ref int j)


{
Console.WriteLine("int");
}


static void Main(string[] arg)


{
int i, j;
TestPara(i, ref j); //error, 参数未初始化

i = 1;
j = 2;
TestPara(i, ref j); //OK
}
输出参数:
1、使用out关键字修饰的参数是输出参数,定义了输出参数的函数必须在函数里对输出参数赋值。
2、调用函数时,传入的输出变量可以不用初始化。
3、函数调用时,也需要在输出参数前面加out关键字。
//输出参数
static void TestPara(out int i)


{
i = 1; //必须在该函数内给输出参数赋值,否则error
Console.WriteLine("int");
}

static void Main(string[] arg)


{
int i ; //可以不用初始化
TestPara(out i);
}
delegate:
类似C++中的函数指针,先声明delegate的类型,利用new创建一个delegate,指定与之关联的函数,然后就可以用delegate调用函数。

class Test


{
//声明一个delegate,指定函数的参数和返回值
delegate void MyDelegate(int i);

static void Func2(int i) //与delegate匹配

{

}

static void Main(string[] arg)

{
//delegate和函数的参数与返回值都必须一致
MyDelegate md = new MyDelegate(Func2);
//通过delegate调用函数
md(4);
}
}