C#学习速记_函数

定义和使用函数

用函数名、0或多个参数及返回值定义

控制台应用函数定义

// 定义

static <returnType> <FunctionName>(<paramType> <paramName>, ...)
{
    ...
    return <returnValue>
}

// 例子

static double Multiply(double myVal1, double myVal2)
{
    return myVal1 * myVal2;
}



返回值

  • 返回值可以是任意类型
  • 无返回值时, void 声明指定
  • 有返回值时, return 返回值
  • return 执行时,程序立即返回调用代码处,return 后面的代码不会执行
// 表达式体定义函数,适用于只有一行代码的函数

static double Multiply(double myVal1, double myVal2) => myVal1 * myVal2;

参数

  • 参数可以是任意类型
参数匹配

调用函数时,提供的参数类型、顺序及个数,必须与函数的定义相同

参数数组
  • 表示个数不确定的特定类型的参数时使用
  • params 必须是最后一个参数, 并且只有一个

// 定义

static <returnType> <FunctionName>(<paramType> <paramName>, ..., params <type>[] <name>)
{
    ...
    return <returnValue>
}

// 举例

static int SumVals(int noneInt, params int[] vals)
{
    int sum = 0;
    foreach (int val in vals)
    {
        sum += val;
    }
    return sum;
}

static void Main(string[] args)
{
    int sum = SumVals(0, new int[] {1, 5, 2, 9, 8});
    Console.WriteLine($"Summed Values = {sum}");
    Console.ReadKey();
}

引用参数

ref 参数必须是变量,变量必须初始化


// 定义

static <returnType> <FunctionName>(ref <paramType> <paramName>, ...)
{
    ...
    return <returnValue>
}

// 例子

static int SumVals(ref int sum, params int[] vals)
{
    foreach (int val in vals)
    {
        sum += val;
    }
    return sum;
}

static void Main(string[] args)
{
    int refSum = 0;
    int sum = SumVals(ref refSum, new int[] { 1, 5, 2, 9, 8 });
    Console.WriteLine($"Summed Values = {sum}");
    Console.ReadKey();
}


输出参数

调用时,out 参数未赋值或已赋值均可,但函数执行时,其中存储的值会丢失


static int MaxValue(int[] intArray, out int maxIndex)
{
    int maxVal = intArray[0];
    maxIndex = 0;
    
    for (int i = 0; i < intArray.Length; i++)
    {
        if (intArray[i] > maxVal)
        {
            maxVal = intArray[i];
            maxIndex = i;
        }
    }
    
    return maxVal;
}

static void Main(string[] args)
{
    int[] myArray = {1, 8, 3, 6, 2, 5, 9, 3, 0, 2};
    int maxIndex;
    
    Console.WriteLine($"The maximum value is myArray is {MaxValue(myArray, out maxIndex)}");
    
    Console.WriteLine($"The first occurrence of this value is at element {maxIndex + 1}");
}


变量的作用域

使用 static, const 关键字定义全局作用局的变量。const 可以修改。

其它结构中变量的作用域

  1. 循环内引用循环外的变量时,变量必须定义并初始化。

int i;
string text;

for (i = 0; i < 10; i++)
{
    text = "Line" + Convert.ToString(i); // 报错,使用前 text 未初始化
    Console.WriteLine($"{text}")
}

Console.WriteLine($"Last text output in loop: {text}")

  1. 循环体外不能直接引用循环内定义的变量。

int i;
for (i = 0; i < 10; i++)
{
    string text = "Line" + Convert.ToString(i);
    Console.WriteLine($"{text}")
}

Console.WriteLine($"Last text output in loop: {text}") // 报错, 循环外 text 未定义

参数和返回值与全局数据

以下效果相同,一般情况下,最好使用参数,而不使用全局数据。

  1. 通过参数

static void Main(string[] args)
{
    int val = 5;
    Console.WriteLine($"val = {val}");
    ShowDouble(ref val);
    Console.WriteLine($"val = {val}");
    Console.ReadKey();
}

static void ShowDouble(ref int val)
{
    val *= 2;
    Console.WriteLine($"val doubled = {val}");
}
  1. 通过全局变量

static int val;

static void Main(string[] args)
{
    val = 5;
    Console.WriteLine($"val = {val}");
    ShowDouble();
    Console.WriteLine($"val = {val}");
    Console.ReadKey();
}

static void ShowDouble()
{
    val *= 2;
    Console.WriteLine($"val doubled = {val}");
}

Main() 函数

  • 应用程序入口点,执行完成后程序结束
  • 程序运行时,指定的命令行参数存放在 args 数组中

static void Main()

static void Main(string[] args)

// 以下2种方式通常用于错误提示,0 表示程序正常终止

static int Main()

static int Main(string[] args)

结构函数


struct CustomeName
{
    public string firstName, lastName;
    public string name() => firstName + " " + lastName; // 函数体内直接访问结构成员
}

函数的重载

可以同时声明多个名称一样的函数,根据参数类型及参数个数不同进行区分,统称为函数的签名


static double ShowDouble()
{
    return 0D;
}

static void ShowDouble(ref int val)
{
    val *= 2;
    Console.WriteLine($"val doubled = {val}");
}

static void ShowDouble(int val)
{
    val *= 2;
    Console.WriteLine($"val doubled = {val}");
}

static void ShowDouble(int val, int tt)
{
    val *= 2;
    Console.WriteLine($"val doubled = {val}");
}

委托

  • 类似函数,使用 delegate 声明,但没有函数体
  • 可以做为函数的参数
  • 返回值类型、参数个数及类型必须与委托的函数相同

class Program
{

    delegate double MyDelegate(double param1, double param2);

    static double Multiply(double param1, double param2) => param1 * param2;
    static double Divide(double param1, double param2) => param1 / param2;

    static void Main(string[] args)
    {

        MyDelegate myDelegate;

        Console.WriteLine("Enter 2 numbers separated with a comma:");
        string input = Console.ReadLine();

        int commaPos = input.IndexOf(',');

        double param1 = Convert.ToDouble(input.Substring(0, commaPos));
        double param2 = Convert.ToDouble(input.Substring(commaPos + 1, input.Length - commaPos - 1));

        Console.WriteLine("Enter M to multiply or D to divide:");
        input = Console.ReadLine();

        if (input == "M")
        {
            myDelegate = new MyDelegate(Multiply);
            // myDelegate = Multiply;
        }
        else
        {
            myDelegate = new MyDelegate(Divide);
            // myDelegate = Divide;
        }

        Console.WriteLine($"Result: {myDelegate(param1, param2)}");

        Console.ReadKey();
    }
}

转载于:https://my.oschina.net/moyung2014/blog/1809605

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值