方法表示类可以做的事情,类拥有的功能。如前文中介绍的汽车类,拥有方法Run,表示汽车可以启动,可以行驶。本节介绍方法的其他内容。
方法可以带参数,也可以不带参数。方法是否带参数应该根据程序的实际需要进行选择。下面介绍两个实例演示不带参数和带参数方法的定义方法。
创建一个Windows控制台应用程序,创建几个不同的方法。
(1)创建一个名为MethodPara的控制台应用程序项目。
(2)修改Program.cs文件的内容如下:
namespace MethodPara
{
class Program
{
static void Main(string[] args)
{
MyClass myClass = new MyClass();
myClass.MyMethod1();
myClass.MyMethod2("wang");
}
}
class MyClass
{
/// <summary>
/// 方法1,输出“Thank You!”
/// </summary>
public void MyMethod1()
{
Console.WriteLine("Thank You!");
}
/// <summary>
/// 方法2,输出“Thank You!”加参数值
/// </summary>
/// <param name="m">想要输出的值</param>
public void MyMethod2(string m)
{
Console.WriteLine("Thank You! {0}!", m);
}
}
}
按Ctrl+F5组合键运行程序,运行结果如图6-12所示。
图6-12 运行结果
代码中定义了两个方法MyMethod1和MyMethod2。其中MyMethod1不带参数,直接输出“Thank You!”,MyMethod2带一个字符串参数,输出时输出“Thank You!”加参数。从本质上讲两个方法没有区别,但带参数的方法使得代码更加灵活一些。
构造函数是在类的实例被创建时自动被执行的方法,在该方法中可以进行一些初始化的工作。该方法的特点是和类名同名,构造函数可以与普通方法一样自由选择是否带参数。下面介绍一个实例,演示构造函数的使用方法。
创建一个Windows控制台应用程序,创建几个不同的构造函数。
(1)创建一个名为MethodConstruct的控制台应用程序项目。
(2)修改Program.cs文件的内容如下:
namespace MethodConstruct
{
class Program
{
static void Main(string[] args)
{
Cars a = new Cars();
Cars b = new Cars("法拉利");
Cars c = new Cars(3);
Cars d = new Cars("奔驰", 5);
}
}
class Cars
{
/// Farmer类的无参数构造函数
public Cars()
{
Console.WriteLine("一个新的Cars类!");
}
/// Farmer类的带参数构造函数
public Cars(string m_Name)
{
Console.WriteLine("一个新的名为{0} 的Cars类!", m_Name);
}
/// Farmer类的带参数构造函数
public Cars(int m_age)
{
Console.WriteLine("一个新的寿命为{0} 的Cars类!", m_age);
}
/// Farmer类的带参数构造函数
public Cars(string m_Name, int m_age)
{
Console.WriteLine("一个新的寿命为{0} 名为{1} 的Cars类!", m_age,
m_Name);
}
}
}
按Ctrl+F5组合键运行程序,运行结果如图6-13所示。
图6-13 运行结果
代码中定义了几个构造函数,在定义Cars类实例时选用了不同的构造函数。因此,在输出时产生了不同的结果。
析构函数用于析构类的实例,析构是指在回收对象中无用的资源。C#中一个类只能有一个析构函数,并且无法调用析构函数,它们是被自动调用的。这是由于.NET Framework实行了一种垃圾回收机制,.NET Framework决定何时回收对象中的资源。
一般不需要编写析构函数,下面通过一个实例介绍析构函数的使用方法。
创建一个Windows控制台应用程序,创建析构函数。
(1)创建一个名为MethodDestroy的控制台应用程序项目。
(2)修改Program.cs文件的内容如下:
namespace MethodDestroy
{
class Program
{
static void Main(string[] args)
{
//调用无参数构造函数创建myFarmer1
Cars myFarmer1 = new Cars();
}
}
class Cars
{
// Cars类的无参数构造函数
public Cars()
{
Console.WriteLine("一个新的Cars类被创建!");
}
// Cars类的析构函数
~Cars()
{
Console.WriteLine("一个Cars类对象被析构!");
}
}
}
按Ctrl+F5组合键运行程序,运行结果如图6-14所示。
图6-14 运行结果
可以看到,无需显式的调用析构函数,.NET框架会自动地析构该对象。
静态方法无需创建类实例即可使用,声明和创建一个静态方法需要使用static关键字。下面通过一个实例演示静态方法的使用。
创建一个Windows控制台应用程序,创建静态方法。
(1)创建一个名为MethodStatic的控制台应用程序项目。
(2)修改Program.cs文件的内容如下:
namespace MethodStatic
{
class Program
{
static void Main(string[] args)
{
//无需创建MyClass的实例
MyClass.MyMethod();
}
}
class MyClass
{
public static void MyMethod()
{
Console.WriteLine("这是一个静态方法!");
}
}
}
按Ctrl+F5组合键运行程序,运行结果如图6-15所示。
图6-15 运行结果
可以看到,无需创建类MyClass的实例,直接使用类名加方法名的方式可以访问该静态方法。
重载方法是一种很有效的代码组织形式。如大部分常见的数值类型都可以进行加法,但一般是同种数据类型的数据相加。如果不能使用重载,那么需要为每一种类型实现不同的方法,并提供不同的方法名称。
使用重载方法的优点是可以使这些方法具有统一的名称,方便代码的使用。下面通过一个实例演示方法重载的优点。
创建一个Windows控制台应用程序,演示方法的重载。
(1)创建一个名为MethodOverload的控制台应用程序项目。
(2)修改Program.cs文件的内容如下:
namespace MethodOverload
{
class Program
{
// 求两个双精度浮点数的和
static double Add(double x, double y)
{
return x + y;
}
// 求两个整数的和
static int Add(int x, int y)
{
return x + y;
}
// 连接两个字符串
static string Add(string x, string y)
{
return x + y;
}
static void Main(string[] args)
{
Console.WriteLine("5 + 3 的值为:{0}", Add(5, 3));
Console.WriteLine("5.3 + 3.5 的值为:{0}", Add(5.3, 3.5));
Console.WriteLine("Thank+ You! 的值为:{0}", Add("Thank ", "
You!"));
}
}
}
按Ctrl+F5组合键运行程序,运行结果如图6-16所示。
图6-16 运行结果
可以看到,所有3种类型数据的加法均使用了同一个名称即Add。这3种方法的名称相同,但参数不同。C#提供的这种方法重载的机制可以自动识别所需调用的方法,非常方便。
当在子类中需要调用父类中的方法时,可以使用base关键字。base关键字用于表示被继承的类。下面通过一个实例演示访问父类中的方法。
创建一个Windows控制台应用程序,演示访问父类中的方法。
(1)创建一个名为MethodParent的控制台应用程序项目。
(2)修改Program.cs文件的内容如下:
namespace MethodParent
{
class Program
{
static void Main(string[] args)
{
MyClass2 a = new MyClass2();
a.Method2();
}
}
class MyClass1
{
public void Method1()
{
Console.WriteLine("父类方法!");
}
}
class MyClass2 : MyClass1
{
public void Method2()
{
base.Method1();
Console.WriteLine("子类方法!");
}
}
}
3.运行结果
按Ctrl+F5组合键运行程序,运行结果如图6-17所示。
图6-17 运行结果
在MyClass2中只包含一个Method2方法。在该方法中包含了base关键字调用父类的Method1方法,因此在结果中不仅输出了“子类方法!”,还输出“父类方法!”。