C#面向对象编程-类和对象

方法的使用

方法在类或结构中声明,声明时需要指定修饰符、返回类型、方法名称以及参数。方法的参数放在括号中,并用逗号隔开。空括号表示方法不需要参数。
定义方法的语法如下:
<访问修饰符> <返回类型> <方法名称>(参数列表)
{
//方法主体
}
访问修饰符:主要用于决定变量或方法对于另一个类的可见性。
返回类型:一个方法可以返回一个值。返回类型是方法返回的值的数据类型。如果方法不返回任何值,则返回类型为void。
方法名称:必须是一个有意义的标识符,并且区分大小写。该标识符应该描述出方法的用途,但是不能与类中声明的其他标识符相同。
参数列表:是指在方法名后面括号内的一系列参数,这些参数是用来传递和接收方法的数据。
方法主体:包含了调用方法时的实际执行语句。

C#中调用方法

编写程序,分别计算7、6、5的阶乘。

using System;
namespace Project2
{
    class Program
    {
        static void Factorial(int a)
        {
            int factorial = 1;
            for (int i = a; i > 0; i--)
            {
                factorial *= i;
            }
            Console.WriteLine("{0}的阶乘={1}\n", a, factorial);
        }
        static void Main(string[] args)
        {
            Factorial(7);
            Factorial(6);
            Factorial(5);           
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了在Main方法中,计算整数的阶乘。在代码中首先定义一个整型变量factorial,用于阶乘的计算。由于每计算一次阶乘,变量factorial都需要进行一次初始化,这种重复性的操作不但复杂,而且容易出错。

7的阶乘=5040

6的阶乘=720

5的阶乘=120

传递参数

参数是用于向方法传递值或者引用。参数有两种形式:用户自定义方法括号里面的变量名,称为形式参数,简称形参。在Main方法中调用另一个方法时,方法名后面括号中的参数称为实际参数,简称实参。方法的参数从方法被调用时指定的实参获取它们的实际值。
参数可以通过以下四种类型进行传递。

  1. 按值参数传递
    按值参数进行传递时,方法中的变量修改不会影响参数列表。因为在传值过程中会为每个参数创建一个新的存储位置,并且实际参数的值会复制给形参,因此实参和形参使用的是两个不同内存中的值。所以,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全
    编写程序,将变量y按值传递给方法Method
using System;
namespace Project4
{
    class Program
    {
        public void Method(int x)   //形参x是通过值传递的
        {
            x *= x; //	对x的更改不会影响x的原始值
            Console.WriteLine("Method方法内的值: {0}", x);
        }
        static void Main()
        {
            Program n = new Program();
            int y = 9;
            Console.WriteLine("调用Method方法之前的值: {0}", y);
            n.Method(y);  // 实参y是通过值传递变量
            Console.WriteLine("调用Method方法后的值: {0}", y);
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了按值传递值类型的参数。在代码中,变量y是值类型,它的值为9。在调用Method时,y的内容复制到参数x中,并计算x的平方值。但是在Main中,y的值在调用Method方法之后与之前相同。所以,在方法内发生的更改只影响本地变量x,无法影响到该变量的原始值。

调用Method方法之前的值: 9
Method方法内的值: 81
调用Method方法后的值: 9
  1. 按引用参数传递
    该方式就是对变量内存位置的引用。与值参数不同的是它不会为这些参数创建一个新的存储位置。引用参数与提供给方法的实际参数具有相同的内存位置。在C#中,使用ref关键字声明引用参数。
    编写程序,将变量y按引用传递给方法Method。
using System;
namespace Project5
{
    class Program
    {
        public void Method(ref int x)//形参x通过引用传递
        {
            x *= x;// 对x的改变会影响x的原始值。
            Console.WriteLine("Method方法内部的值: {0}", x);
        }
        static void Main()
        {
            Program n = new Program();
            int y = 7;
            Console.WriteLine("Main方法内部的值: {0}", y);
            n.Method(ref y);  // 实参y是通过引用传递变量
            Console.WriteLine("通过引用传递变量: {0}", y);
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了按引用传递的参数。在代码中,传递的不是y的值,而是传递y的引用,也就是变量y在内存中的地址。参数x是一个int类型的地址,在这种情况下,是对y的引用。因此,当x在Method方法中进行平方计算时,实际求平方值的就是x所指的y。

Main方法内部的值: 7
Method方法内部的值: 49
通过引用传递变量: 49
  1. 按输出参数传递
    用户自定义的方法一般可以通过return语句返回一个值。如果希望方法返回多个值,可以按输出参数的方式进行传递参数。对于输出参数来说,调用方提供的实参的初始值并不重要,除此之外,输出参数与引用参数类似。输出参数使用out修饰符声明的。
    编写程序,求出数组中的最大值进行返回,并返回最大值的一个索引
using System;
namespace Project6
{
    class Program
    {
        //需要返回两个参数,一个是数组元素的最大值,另一个是最大值的索引
        static int MaxNum(int[] arr, out int[] num)
        {
            //声明变量maxNum为最大值,并且假定数组的第一个元素为最大值
            int maxNum = arr[0];          
            int[] num1 = {0,0,0,0,0,0,0 };
            //num[0] = 0;      //因此这个索引值也为0
            for (int i = 0; i < arr.Length; i++)
            {
                if (maxNum < arr[i])
                {
                    maxNum = arr[i];
                }
            }
            //找到最大元素的下标
            for (int i = 0; i < arr.Length; i++)
            {
                if (maxNum == arr[i])
                {
                    num1[i] = i;
                }
            }
            num = num1;
            return maxNum;
            
        }
        static void Main(string[] args)
        {
            int[] myArr = {4, 567,  567, 3, 9, 6, 8 };
            int[] num = new int[myArr.Length];
            Console.WriteLine("数组myArr最大的元素值是{0}", MaxNum(myArr, out num));

            for (int i = 0; i < num.Length; i++)
            {
                Console.Write(num[i]+" ");
            }              
            Console.ReadKey();
        }
    }
}



【程序分析】本例演示了按输出参数进行传递。在代码中自定义MaxNum方法,该方法的功能是选出一个数组中的最大值和最大值的索引,所以在该方法的括号里声明了两个参数,分别为数组arr,用于接收数组元素;以及变量num,由于不确定最大值的个数,所以需要使用out进行声明。在MaxNum方法中,首先声明变量maxNum用于表示最大值,并且假定数组的第一个元素为最大值,所以将arr[0]赋给该变量;接着通过for循环遍历数组arr,并且使用if语句判断出该数组中的最大值;然后将最大值arr[i]赋给变量maxNum,将最大值的索引值赋给变量num;最后在Main方法中,调用MaxNum方法,输出数组myArr的最大元素值和与其对应的索引值。

数组myArr最大的元素值是567
0 1 2 0 0 0 0
  1. 按参数数组传递
    当声明一个方法时,用户不能确定要传递的参数个数时,可使用params关键字来定义。在C#中使用参数数组可以简化代码,因为在调用代码时就可以不必传递数组,而是传递同类型的几个参数。
    编写程序,用于计算整型元素的和
using System;
namespace Project7
{
    class Program
    {
        static int Add(params int[] arr)
        {
            int sum = 0;
            foreach (int outarr in arr)
            {
                sum += outarr;
            }
            return sum;
        }
        static void Main(string[] args)
        {
            int[] myArr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            Console.WriteLine("myArr数组中所有元素的和为:" + Add(myArr));
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了参数数组的使用。在代码中,首先自定义一个Add方法,在该方法的括号里使用关键字params,并对数组arr进行修饰;接着在方法体内使用foreach语句,对数组arr的所有元素进行相加求和;然后在Main方法中定义数组myArr并为其赋值;最后调用Add方法,将数组myArr作为实际参数进行传递。

myArr数组中所有元素的和为:45

方法的分类

方法分为静态方法和实例方法。其中使用static修饰符声明的方法称之为静态方法,而不使用static修饰符声明的方法称为实例方法。

  1. 静态方法
    静态方法不对特定实例进行操作,并且只能访问类中的静态成员,而且不能使用实例成员。访问静态方法时可以直接访问,也可以使用类名而不需要创建对象,也不能使用对象名来引用。
  2. 实例方法
    实例方法对特定实例进行操作,并且能够访问静态成员和实例成员。在调用实例方法的实例时,可以通过this显式地访问该实例。而在静态方法中引用this是错误的。
    编写程序,演示静态方法与实例方法的使用。
using System;
namespace Project8
{
    class Program
    {
        int exampleVer;         //实例成员
        static int staticVer;  //静态成员
        void exampleMethod()   //实例方法
        {
            //在实例方法中,可以访问静态成员,也能访问实例成员
            exampleVer = 1;     //等价于this.exampleVer = 1;
            staticVer = 1;
            Console.WriteLine("实例成员:{0}", exampleVer);
            Console.WriteLine("静态成员:{0}", staticVer);
        }
        static void staticMethod()//静态方法
        {
            //在静态方法中,可以访问静态成员,但不能访问实例成员
            staticVer = 2;
            Console.WriteLine("静态成员:{0}", staticVer);
        }
        static void Main(string[] args)
        {
            //访问静态方法
            //调用静态方有两种,一种可以直接调用,另一种使用类名
            Program.staticMethod();
            //访问实例方法
            Program p = new Program();
            p.exampleMethod();
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了静态方法与实例方法的使用。在代码中首先定义两个变量exampleVer和staticVer,其中,使用static关键字声明的变量称为静态成员,而不被关键字声明的都称为实例成员。
用户自定义的exampleMethod方法没有被static声明,所以它是一个实例方法。在实例方法中,可以访问静态成员,也能访问实例成员,同时也可以使用this关键字来访问实例成员。在调用实例方法时,则必须使用类的实例或对象来引用。
用户自定义的staticMethod方法是一个静态方法。在该方法中可以访问静态成员,但不能访问实例成员。在访问静态方法时,可直接访问也可以使用类名进行访问。但是不能使用类的实例或对象来访问。

静态成员:2
实例成员:1
静态成员:1

之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许静态方法使用实例成员变量,这是错误的。基于同样的道理,静态方法中也不能使用关键字this。

外部方法

当方法声明包含extern修饰符时,称该方法为外部方法。外部方法是在外部实现的,编程语言通常是使用C#以外的语言。外部方法不可以是泛型。
extern修饰符通常与“Dll Import”属性一起使用,从而使外部方法可以由DLL(动态链接阵)实现。执行环境可以支持其他用来提供外部方法实现的机制。当外部方法包含“Dll Import”属性时,该方法声明必须同时包含一个static修饰符。
编写程序,利用extern修饰符和“Dll Import”属性,调用“User32.dll”库文件,实现自定义信息提示框的功能。

using System;
//使用DllImport属性之前应该引入命名空间
using System.Runtime.InteropServices;
namespace Project9
{
    class Program
    {
        [DllImport("User32.dll")]
        public static extern int MessageBox(int h, string m, string c, int type);
        static int Main(string[] args)
        {
            Console.Write("请输入您的姓名:");
            string name = Console.ReadLine();
            return MessageBox(0, "您好:" + name + "\n\n" + "欢迎学习C#", "信息提示", 0);
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了外部方法的使用。外部方法是通过关键字extern声明的,由于配合“DLLImport”属性使用,所以必须包含static关键字。在本段代码中的Program类里,定义了一个外部方法MessageBox,并声明好对应的形式参数。最后在Main方法中进行调用。这里需要注意,对话框是利用return强行弹出的,所以需要将Main方法改为有返回值。
在这里插入图片描述

Main方法

Main方法是程序的入口点。程序从这里开始,也是从这里结束。C#的Main方法必须是一个类的静态成员。Main方法可以是void类型也可以是非void类型,并可以接受字符串数组形式的命令行参数。

  1. Main方法的执行过程
    当程序在执行编写的源代码时,会是先找Main方法,然后开始执行Main方法中“{”开始后的第一句代码,并依次执行。如果遇到Main方法中有调用其他的方法时,便会根据方法名称找到定义方法的代码,然后执行这个方法内的代码,执行完这个方法后,再返回到Main方法继续执行,直到遇到Main方法的结束符“}”,执行程序结束。
  2. Main方法的四种表现形式
    (1) 静态的无返回值的Main方法。static void Main()
    (2) 静态的有返回值的Main方法。static int Main()
    (3) 静态的无返回值,并且有参数的Main方法。static void Main(string[] args)
    (4) 静态的有返回值,并且有参数的Main方法。static int Main(string[] args)
    上述有返回值int时,可以用于表示应用程序的终止方式,通常用作一种错误提示。一般情况下,返回“0”表示程序“正常”终止(即应用程序执行完毕,并安全地终止)。

类与对象、字段和属性是使用

构造函数与析构函数的使用

虚方法的使用

方法的重载

结构体与类的区别

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值