C#学习笔记(3) 方法

2022/6/30 14:24:08

本文主要是介绍C#学习笔记(3) 方法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

3.1方法的结构(本章内容如果是有C/C++基础的人可以粗略跳过)

方法是一块具有名称的代码。可以使用方法的名称从别的地方执行代码,也可以把数据方法并接收数据输出。

方法主要有两个部分方法头与方法体;

方法头指定方法的特征,包括:

(1)方法是否返回数据,如果返回,返回什么类型;

(2)方法的名称

(3)哪种类型的数据可以传递给方法或从方法返回,以及如何应对处理这些数据

方法体包含可执行代码的语句序列,执行过程从方法体的第一条语句,一直到整个方法结束。

 

3.2局部变量与局部常量

局部变量:

局部变量也保存数据。字段通常保存和对象状态有关的数据,而建局部变量经常是用于保存

局部的或临时的计算数据。

    形如:变量类型 变量名称 = 可选的初始化语句(想同类型的变量或者值);

(1)局部变量的存在和生存期仅限于创建它的块及其内嵌的块。

(2)从声明它的那一点开始存在,在块完成执行时结束存在。

(3)可以在方法体内任意位置声明局部变量,但必须在使用它们前声明。

局部常量:

局部常量很像局部变量,只是一旦被初始化,它的值就不能改变了。如同局部变量,局部瘤量必须声明在块的内部。

    形如:关键字const 变量类型 变量名称 = (必须进行初始化);

(1)在声明时必须初始化。

(2)在声明后不能改变。

 

相信大部分人有一定的编程基础所以下内容跳过(与C/C++基本一致就不多赘述了)

3.3方法的调用 跟(C/C++)一样,使用方法名称并带上与之对应的方法列表。

3.4返回值

3.5返回语句与void方法

3.6形参与实参

 

3.7局部函数(从C#7.0开始添加的新标准)

方法块内的代码可以调用另一个方法。如果另一个方法在同一个类内,可以直接使用它的名称并传入所需的参数(参见下一节)进行调用。如果另一个方法在不同的类中、必须通过这个类的一个对象实例调用它。另一个类中的方法必须使用 public访问修饰符声明。

从C#7.0开始,你可以在一个方法中声明另一个单独的方法。这样可以将嵌入的方法跟其他代码隔离开来、所以它只能在包含它的方法内调用。如果使用恰当,这可以使代码更清晰,更于维护。这些嵌入的方法被称为局部函数。

与局部变量必须在使用之前进行声明不同,你可以在包含方法的任意位置声明局部函数。下面的代码演示了一个 MethodWithlocalFunction 方法,它包含了一个局部函数。

class Program
{
  public void  MethodWithLocalFunction ()
  {
    int  MyLocalFunction (int zì)//声明局部函数
    {
      return z1*5;
    }
    int results= MyLocalFunction (5);//调用局部函数
    Console. Writeline($"Results of local function call:{results}");
  }
  static void Main(string[]args)
  {
    Program myProgram=new Program();
    myProgram. MethodWithLocalFunction ();//调用方法
  )
}

3.8引用参数(这跟C++中的引用&几乎一致)

使用方法:

(1)使用引用参数时,必须在方法的声明和调用中都使用ref修饰符。

(2)实参必须是变量,在用作实参前必须被赋值。如果是引用类型变量,可以赋值为一个用或null。

引用参数的特征:

(1)不会在栈上为形参分配内存。

(2)形参的参数名将作为实参变量的别名,指向相同的内存位置。

注:由于形参名和实参名指向相同的内存位置,所以在方法的执行过程中对形参体方法完成后依然可见(表现在实参变量上)。记住要在方法的声明和调用上都使用ref关键字。

引用使用展示:

using System;
class Program
 {
    static void Main()
    {
        int a=5;
        ref int b = ref a;
        Console.WriteLine($"a = {a},b = {b}");
        b = 10;
        Console.WriteLine($"a = {a},b = {b}");
    }
}

运行结果:

引用作为方法参数代码展示(这与C++引用几乎一致就不详细解释了):

using System;
 class Method
 {
    public
    void swap(ref int x,ref int y)
    {
        int temp=x;
        x = y;
        y = temp;
    }
 }
 class Program
 {
    static void Main()
    {
        Method way = new Method();
        int a = 5;
        int b = 10;
        Console.WriteLine("a = {0},b = {1}", a, b);
        Console.WriteLine("after swap value");
        way.swap(ref a,ref b);
        Console.WriteLine("a = {0},b = {1}", a, b);
    }
}

运行结果:

 

 

ref局部变量与ref返回

别名功能(3.8第一个代码)不是ref局部变量功能最常见的用途。实际上,它经常和ref返回功能一般用。ref返回功能提供了一种使方法返回变量引用而不是变量值的方法。这里需要的额外语法使用了ref关键字两次:一次是在方法的返回类型声明之前;另一次是在return关键字之后,被返回对象的变量名之前。

using System;
 class Score
 {
    private int score;
    public void display()
    {
        Console.WriteLine($"score = {score}");
    }
    public ref int get_s()
    {
        return ref score;
    }
    public void s()
    {
        this.score = 5;
    }
 }
 class Program
 {
    static void Main()
    {
        Score s1 = new Score();
        s1.s();
        s1.display();
        ref int r_score =ref s1.get_s();
        r_score = 10;
        s1.display();
    }
} 

说明我们在此程序中运用,ref返回在类外通过修改r_score的值(按C++理解方式,此时r_score与s1中score有相同的地址)

运行结果:

 

 

 

3.9输出参数(在实际使用中比较少)

输出参数用于从方法体内把数据传出到调用代码,它们的行为与引用参数类似。如同引用参数,输出参数有以下要求。

(1)必须在声明和调用中都使用修饰符。输出参数的修饰符是out而不是ref。

(2)和引用参数相似,实参必须是变量,而不能是其他类型的表达式。这是有道理的,因为方法需要内存位置来保存返回值。

与引用参数类似,输出参数的形参充当实参的别名。形参和实参都是同一块内存位置的名称。显然,在方法内对形参做的任何改变在方法执行完成之后(通过实参变量)都是可见的。

 

与引用参数不同,输出参数有以下要求。

(1)在方法内部、给输出参数赋值之后才能读取它。这意味着参数的初始值是无关的,而且没有必要在方法调用之前为实参赋值。

(2)在方法内部,在方法返回之前,代码中每条可能的路径都必须为所有输出参数赋值。

 

因为方法内的代码在读取输出参数之前必须对其写人,所以不可能使用输出参数把数据传入方法。事实上,如果方法中有任何执行路径试图在方法给输出参数赋值之前读取它的值,编译器就会产生一条错误消息。

 

3.10参数数组

3.10.1参数数组概述

在之前的描述中,一个形参必须严格地对应一个实参。参数数组则不同,它允许特定类型的零个或多个实参对应一个特定的形参。参数数组的重点如下。

(1)在一个参数列表中只能有一个参数数组。

(2)如果有参数数组,它必须是列表中的最后一个。

(3)由参数数组表示的所有参数必须是同一类型。

声明一个参数数组时必须做的事如下。

(1)在数据类型前使用params修饰符。

(2)在数据类型后放置一组空的方括号。

形如:

方法返回类型 方法名称(修饰符 变量类型[ ] 参数名称)

Int sum( params int[ ] arrry) {

    ……

}

类型名后面的空方括号指明了参数是一个整数数组。在这里不必在意数组的细节,它们将在后面详细阐述。而现在,你需要了解的内容如下。

(1)数组是一组有序的同一类型的数据项。

(2)数组使用一个数字索引进行访问。

(3)数组是一个引用类型,因此它的所有数据项都保存在堆中。

3.10.2 方法调用

可以使用两种方式为参数数组提供实参。

(1)一个用逗号分隔的该数据类型元素的列表。所有元素必须是方法声明中指定的

ListInts(10, 20, 30);//3个int

(2)一个该数据类型元素的一维数组。

int [] intArray = {1,2,3};

ListInts(intArray);//一个数组变量

注:在这些示例中,没有在调用时使用params修饰符。参数数组中修饰符他参数类型的模式并不相符。

params修饰符的用法总结如下。

(1)在声明中需要修饰符。

(2)在调用中不允许有修饰符。

 

3.11方法重载(与C++中的函数重载基本一致就不再详细赘述)

一个类中可以有多个同名方法,这叫作方法重载。使用相同名称的每个方法必须有一个和其他方法不同的签名。

(1)方法的名称;

(2)参数的数目;

(3)参数的数据类型和顺序;

(4)参数修饰符。

注:返回类型不是签名的一部分,而我们往往误认为它是签名的一部分。形参的名称也不是签名的一部分。

 

3.12命名参数与可选参数

命名参数是真的不想说,我感觉在实际的开发过程中没有人回去用(先挖个坑,万一以后真的有需要再来补上)

可选参数(跟构造函数中的参数默认值很像):

所谓可选参数就是可以在调用方法的时候包含这个参数,也可以省略它。

为了表明某个参数是可选的,你需要在方法声明中为该参数提供默认值。指定默认值的语法,和初始化局部变量的语法一样,如下面代码的方法声明所示。

形参b的默认值设置成3;因此、如果在调用方法的时候只有一个参数,方法会使用3作为第二个参数的初始值。

class MyClass
{
    public int Cale(int a, int = 3)
    {
        return a+b; 
    }
    static void Main()
    {
        MyClass me = new MyClass();
        int r0 = mc. Calc(5,6);//使用显式值
        int r1 = mc. Calc(5);//为b使用默认值
        Console.WriteLine($"{r0},{r1}");
    )
}
//这段代码产生如下输出:
//11,8            

对于可选参数的声明,我们需要知道如下几个重要事项。

(1)不是所有的参数类型都可以作为可选参数。

(2)只要值类型的默认值在编译的时候可以确定,就可以使用值类型作为可选参数。只有在默认值是null的时候,引用类型才可以用作可选参数。

3.13递归

略……

搜索

复制

<iframe></iframe>

这篇关于C#学习笔记(3) 方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程