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

 //static
//static
 static void TestStatic()
static void TestStatic()


 {
{

 }
}

 //非static
//非static
 void TestNonStatic()
void TestNonStatic()


 {
{

 }
}

 static void Main(string[] arg)
static void Main(string[] arg)


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

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


 {
{
 Console.WriteLine("long");
    Console.WriteLine("long");
 }
}

 //int
//int
 static void TestPara(int i)
static void TestPara(int i)


 {
{
 Console.WriteLine("int");
    Console.WriteLine("int");
 }
}


 static void Main(string[] arg)
static void Main(string[] arg)


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


 {
{
 Console.WriteLine("int");
    Console.WriteLine("int");
 }
}


 static void Main(string[] arg)
static void Main(string[] arg)


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


 {
{
 Console.WriteLine("int");
    Console.WriteLine("int");
 }
}


 static void Main(string[] arg)
static void Main(string[] arg)


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

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


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

 static void Main(string[] arg)
static void Main(string[] arg)


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

 class Test
class Test


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

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

 
     {
{

 }
    }

 static void Main(string[] arg)
    static void Main(string[] arg)

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