3.3C#函数成员之方法(Method)

1.方法定义

返回类型 方法名称<类型参数>(值参数, 默认值参数 = 值, {ref | out | in}引用参数, params 参数数组) {
    //方法体
}

方法可以使用 return 语句将控制权返回给调用方。

在返回 void 的方法中,return 语句无法指定表达式。

在返回非 void 的方法中,return 语句必须包含用于计算返回值的表达式。

2.方法分类

名称修饰符访问
静态方法(static method)用 static 修饰类.静态方法
实例方法(instance method)无 static 修饰对象.实例方法

3.参数分类

名称修饰符
值参数
默认值参数
引用参数ref用 ref 修饰
输出参数用 out 修饰
引用参数in用 in 修饰
参数数组用 params 修饰

3.1值参数

没有默认值也没有特殊修饰符的参数。

3.2默认值参数

可以为形参赋默认值,当无实参的时候,将调用这个形参的默认值传递。

3.3 ref引用参数

ref 指定此参数由引用传递,可以由调用方法读取或写入。变量在传递之前需要先初始化。

void Method(ref int refArgument)
{
    refArgument = refArgument + 44;
}

int number = 1;
Method(ref number);
Console.WriteLine(number);
// Output: 45

3.4 out输出参数

out 指定此参数由引用传递,必须由调用方法写入。变量在传递之前未初始化。

void OutArgExample(out int number)
{
    number = 44;
}

int initializeInMethod;
OutArgExample(out initializeInMethod);
Console.WriteLine(initializeInMethod);     
// Output: 44

3.5 in引用参数

in 指定此参数由引用传递,可以由调用方法读取,但不可以写入。

void InArgExample(in int number)
{
    // 取消下行的注释,会遇到 error CS8331
    //number = 19;
}

int readonlyArgument = 44;
InArgExample(readonlyArgument);
Console.WriteLine(readonlyArgument);    
// Output: 44

3.6 params 参数数组

使用 params 修饰符的方法参数可以采用数量可变的参数。 参数类型必须是一维数组。位置必须放在最后一个。

public class MyClass
{
    public static void UseParams(params int[] list)
    {
        for (int i = 0; i < list.Length; i++)
        {
            Console.Write(list[i] + " ");
        }
        Console.WriteLine();
    }

    public static void UseParams2(params object[] list)
    {
        for (int i = 0; i < list.Length; i++)
        {
            Console.Write(list[i] + " ");
        }
        Console.WriteLine();
    }

    static void Main()
    {
        // You can send a comma-separated list of arguments of the
        // specified type.
        UseParams(1, 2, 3, 4);
        UseParams2(1, 'a', "test");

        // A params parameter accepts zero or more arguments.
        // The following calling statement displays only a blank line.
        UseParams2();

        // An array argument can be passed, as long as the array
        // type matches the parameter type of the method being called.
        int[] myIntArray = { 5, 6, 7, 8, 9 };
        UseParams(myIntArray);

        object[] myObjArray = { 2, 'b', "test", "again" };
        UseParams2(myObjArray);

        // The following call causes a compiler error because the object
        // array cannot be converted into an integer array.
        //UseParams(myObjArray);

        // The following call does not cause an error, but the entire
        // integer array becomes the first element of the params array.
        UseParams2(myIntArray);
    }
}
/*
Output:
    1 2 3 4
    1 a test

    5 6 7 8 9
    2 b test again
    System.Int32[]
*/

4.参数传递方式

由于形参是实参的规范,所以实参的数量和类型需与形参一致。

参数的传递不仅支持按位置从左往右依次传递方式,同时也支持按命名参数传递方式。

//按命名参数传递
方法(参数名称1: 实参1, 参数名称2: 实参2)

5.虚方法、重写方法和抽象方法

方法修饰符声明和实现
虚方法virtual在基类中声明和实现的方法,其中 任何派生类 都可提供更具体的实现。
抽象方法abstract在基类中声明的方法,必须在所有非抽象派生类中 重写 实现。可以理解为没有实现代码的虚方法,仅可在抽象类中使用。
重写方法override在派生类中实现的方法,此方法将 重写 具有相同签名的虚方法或抽象方法。

6.重载

在声明方法的类中,方法的 签名 必须是唯一的。 方法签名包含修饰符、方法名称、类型参数数量、参数的数量、类型。 方法签名不包含返回类型。

重载 允许同一类中的多个方法具有相同的名称,只要它们具有唯一的签名。 在编译重载方法的调用时,编译器使用  重载决策 来确定要调用的特定方法。 重载决策会查找与自变量匹配度最高的一种方法。 如果找不到任何最佳匹配项,则会报告错误。 

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/back/csharp/7871.html

发表评论

登录后才能评论