1、类:是一组具有相同数据结构和相同操作数的对象的集合。类是对一系列具有相同性质的对象的抽象,是对对象共同特征的描述。

语法:[访问修饰符]class<类名>
       {
         //类的主体
       }
例:class Empioyee
{
    //类的实体
}
2、对象可以是现实生活中的一个物理对象,还可以是某一概念实体的实例。例如:一辆汽车、一个人、一本书等...
3、方法:是包含一系列语句的代码块。作用是完成一定的功能。
方法通过指定修饰符、返回值类型、方法名称和任何方法参数在类或结构中声明的。这些部分统称为方法的“签名”。方法参数括在括号中,并用逗号隔开。空括号表示方法不需要参数。
在定义方法时的参数叫“形式参数(形参)”,在调用方法时的参数叫“实际参数(实参)”
  方法可以向调用方返回值。如果返回类型不是void,则方法可以使用return关键字来返回值。
4、普通方法(按参数划分):
(1)值类型参数方法
例:static void Main(string[] args)
        {
            int  i = 10;
            Add(i);
            Console.WriteLine(i);
        }
        static void Add(int i)
        {
            i = 100;
        }
结果:10
(2)引用类型参数方法
例:static void Main(string[] args)
        {
            int[]  i = {10};
            Add(i);
            Console.WriteLine(i[0]);
        }
        static void Add(int[] i)
        {
            i[0] = 100;
        }
结果:100
(3)out关键字参数方法:out单方向从方法内部把数据传到调用方法的地方。out可以用于返回两个参数
例:例:class Program
    {
        static void Main(string[] args)
        {
            int  i = 10;
            Add(out i);
            Console.WriteLine(i);
        }
        static void Add(out int i)
        {
            i = 100;
        }
    }
结果:100
(4)ref关键字参数方法:能进参和出参,进和出的值相同时用ref,不同时用返回值。
例:class Program
    {
        static void Main(string[] args)
        {
            int  i = 10;//赋值也进不去
            double dd;
            Add(ref i,out dd);
            Console.WriteLine(i);
        }
        static void Add(ref int i,out double d)
        {
            Console.WriteLine(i);
            i = 100;
            d = 2.4;
            Console.WriteLine(i);
        }
    }
结果:10
      100
      100
(5)params关键字参数方法:实现了参数的动态变化。注意:params放在参数的最后。
例1:static void Main(string[] args)
        {
            int[] arr = { 1,2};
            Add(1,2,3,4,5);
        }
        static void Add(params int[]arr)
        {
            foreach (int i in arr)
            {
                Console.WriteLine(i);
            }
        }
结果:1
      2
      3
      4
      5
例2:class Program
    {
        static void Main(string[] args)
        {
            int[] arr = { 1,2};
            Add(3);
        }
        static void Add(params int[]arr)
        {
            foreach (int i in arr)
            {
                Console.WriteLine(i);
            }
        }
        static void Add(int i)
        {
            Console.WriteLine("******");
        }
    }
结果:******
补充:有两个方法名相同的方法重载时选择后者。
5、分部方法:
分部类:可以将类或结构、接口或方法的定义拆分到两个或多个源文件中。
以下几种情况需要拆分类定义:处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理。
                            使用自动生成源时,无需重新创建源文件便可将代码添加到类中。
                            若要拆分类定义。
6、partial 关键字指示可在命名空间中定义该类、结构或接口的其他部分。所有部分都必须使用 partial 关键字。
7、分部方法:分部类或结构可以包含分部方法。类的一个部分包含方法的签名。可以在同一部分或另一个部分中定义可选实现。如果未提供该实现,则会在编译时移除方法以及对方法的所有调用。
  注意:分部方法声明必须以上下文关键字 partial 开头,并且方法必须返回 void。
        分部方法可以有 ref 参数,但不能有 out 参数。
        分部方法为隐式 private 方法,因此不能为 virtual 方法。
        分部方法不能为 extern 方法,因为主体的存在确定了方法是在定义还是在实现。
        分部方法可以有 static 和 unsafe 修饰符。
        分部方法可以为泛型的。约束将放在定义分部方法声明上,但也可以选择重复放在实现声明上。参数和类型参数名称在实现声明和定义声明中不必相同。
        不能将委托转换为分部方法。
8、扩展方法:扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
  例:using ExtStrNS;
namespace ClassDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "I'm Guisw,I like .net";
            Console.WriteLine(str.WordCount());
        }
    }
}
namespace ExtStrNS
{
    static class ExtString
    {
        public static int WordCount(this string str)
        {
            return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }
}
注意:如果扩展方法与该类型中定义的方法具有相同的签名,则扩展方法永远不会被调用。
扩展方法被在命名空间级别放入范围中。例如,如果您在同一个名为 Extensions 的命名空间中具有多个包含扩展方法的静态类,则这些扩展方法将全部由 using Extensions; 指令放入范围中。
9、匿名方法:通过使用匿名方法,由于您不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。
10、命名实参:有了命名实参,您将不再需要记住或查找形参在所调用方法的形参列表中的顺序。可以按形参名称指定每个实参的形参。
static void Main(string[] args)
        {
            Program p = new Program();
            p.AddPerson(name: "张三", hight: 171.73f, age: 32);
        }
        public void AddPerson(int age, string name, float hight)
        {
            Console.WriteLine("{0},{1}岁,身高{2}cm", name, age, hight);
        }
注意:如果使用命名参数,必需所有的参数都命名。
11、可选参数:方法、构造函数、索引器或委托的定义可以指定其形参为必需还是可选。 任何调用都必须为所有必需的形参提供实参,但可以为可选的形参省略实参。

     每个可选形参都具有默认值作为其定义的一部分。 如果没有为该形参发送实参,则使用默认值。 默认值必须为常量。

     可选形参在形参列表的末尾定义,位于任何必需的形参之后。 如果调用方为一系列可选形参中的任意一个形参提供了实参,则它必须为前面的所有可选形参提供实参。 实参列表中不支持使用逗号分隔的间隔。