在C#编程中,类是封装数据和行为的核心载体,调用类的方法是实现业务逻辑的基础操作。不同类型的类方法调用规则存在差异,掌握这些规则能提升开发效率。
类方法的基本分类
C#中的类方法按照调用方式可以分为实例方法和静态方法两大类,此外还有构造函数这种特殊的方法,不同类别的调用逻辑完全不同。
实例方法
实例方法是属于类的具体实例的方法,调用前必须先创建类的对象实例。下面定义一个包含实例方法的示例类:
// 定义一个示例类
public class Calculator
{
// 实例方法:计算两个数的和
public int Add(int a, int b)
{
return a + b;
}
}
调用实例方法的步骤如下:
- 使用
new关键字创建类的实例对象 - 通过对象实例加上点号运算符调用对应的方法
具体调用代码示例如下:
class Program
{
static void Main(string[] args)
{
// 创建Calculator类的实例
Calculator calc = new Calculator();
// 调用实例方法Add
int result = calc.Add(3, 5);
Console.WriteLine("相加结果:" + result);
}
}
静态方法
静态方法属于类本身,不需要创建实例就可以直接调用,通常用来定义不依赖实例状态的功能。修改上面的Calculator类,添加一个静态方法:
public class Calculator
{
// 实例方法
public int Add(int a, int b)
{
return a + b;
}
// 静态方法:计算两个数的乘积
public static int Multiply(int a, int b)
{
return a * b;
}
}
静态方法的调用不需要创建对象,直接通过类名加点号运算符调用:
class Program
{
static void Main(string[] args)
{
// 直接通过类名调用静态方法Multiply
int mulResult = Calculator.Multiply(4, 6);
Console.WriteLine("相乘结果:" + mulResult);
}
}
带参数的方法调用
类的方法可以接收不同类型的参数,包括值类型参数、引用类型参数、可选参数和可变参数,调用时需要根据参数定义传递对应的值。
值类型与引用类型参数
值类型参数传递的是值的副本,修改参数不会影响原始变量;引用类型参数传递的是引用地址,修改参数会影响原始对象。示例代码如下:
public class ParamDemo
{
// 值类型参数方法
public void ChangeValue(int num)
{
num = 100;
}
// 引用类型参数方法
public void ChangeArray(int[] arr)
{
arr[0] = 99;
}
}
调用这两个方法的代码:
class Program
{
static void Main(string[] args)
{
ParamDemo demo = new ParamDemo();
int val = 10;
demo.ChangeValue(val);
Console.WriteLine("值类型参数调用后:" + val); // 输出10,原始值未改变
int[] arr = { 1, 2, 3 };
demo.ChangeArray(arr);
Console.WriteLine("引用类型参数调用后第一个元素:" + arr[0]); // 输出99,原始数组被修改
}
}
可选参数与可变参数
可选参数在定义时带有默认值,调用时可以不传递该参数;可变参数使用params关键字定义,可以接收多个同类型的参数。示例类如下:
public class AdvancedParam
{
// 可选参数方法,b的默认值为10
public int Sum(int a, int b = 10)
{
return a + b;
}
// 可变参数方法,接收多个整数
public int Total(params int[] nums)
{
int sum = 0;
foreach (int num in nums)
{
sum += num;
}
return sum;
}
}
调用代码:
class Program
{
static void Main(string[] args)
{
AdvancedParam ap = new AdvancedParam();
// 不传递可选参数b,使用默认值10
int sum1 = ap.Sum(5);
Console.WriteLine("可选参数调用结果:" + sum1); // 输出15
// 传递可选参数b
int sum2 = ap.Sum(5, 20);
Console.WriteLine("传递可选参数结果:" + sum2); // 输出25
// 调用可变参数方法
int total = ap.Total(1, 2, 3, 4, 5);
Console.WriteLine("可变参数调用结果:" + total); // 输出15
}
}
构造函数的调用
构造函数是类初始化时自动调用的特殊方法,用来初始化对象的成员。如果定义了带参数的构造函数,创建对象时需要传递对应的参数。
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
// 默认构造函数
public Person()
{
Name = "默认名称";
Age = 0;
}
// 带参数的构造函数
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
调用不同构造函数的代码:
class Program
{
static void Main(string[] args)
{
// 调用默认构造函数
Person p1 = new Person();
Console.WriteLine("默认构造:" + p1.Name + "," + p1.Age);
// 调用带参数的构造函数
Person p2 = new Person("张三", 25);
Console.WriteLine("带参构造:" + p2.Name + "," + p2.Age);
}
}
继承场景下的方法调用
当子类继承父类时,可以调用父类定义的方法,如果子类重写了父类的方法,调用时会执行子类的实现。使用base关键字可以显式调用父类的方法。
// 父类
public class Animal
{
public virtual void Speak()
{
Console.WriteLine("动物发出声音");
}
}
// 子类
public class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("狗汪汪叫");
}
public void CallBaseSpeak()
{
// 显式调用父类的Speak方法
base.Speak();
}
}
调用代码:
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
dog.Speak(); // 调用子类重写的方法,输出狗汪汪叫
dog.CallBaseSpeak(); // 调用父类的方法,输出动物发出声音
}
}
注意事项
- 调用实例方法前必须确保对象已经实例化,否则会抛出空引用异常
- 静态方法不能直接访问实例成员,只能访问静态成员
- 调用方法时传递的参数类型和数量需要和方法的参数定义匹配
- 重写父类方法时需要使用
override关键字,否则只是定义了新的方法而不是重写