首页 >> 方法大全

方法(C# 编程指南)

2022-05-14 方法大全 250 作者:考证青年

方法(C# 编程指南)

谢谢。

本文内容

方法是包含一系列语句的代码块。程序通过调用方法并指定任何所需的方法参数来执行语句。在 C# 中,每条执行的指令都在方法的上下文中执行。

Main 方法是每个 C# 应用程序的入口点,并在程序启动时由公共语言运行时 (CLR) 调用。在使用顶级语句的应用程序中,方法由编译器生成并包含所有顶级语句。

注意

本文讨论命名方法。有关匿名函数的信息,请参阅表达式。

方法签名

通过指定访问级别(例如 or )、可选修饰符(例如 or )、返回值、方法名称和任何方法参数来声明类、结构或接口中的方法。这些部分共同构成了方法的签名。

重要

出于方法重载的目的,方法的返回类型不是方法签名的一部分。但在确定委托与其指向的方法之间的兼容性时,它是方法签名的一部分。

方法参数用括号括起来并用逗号分隔。空括号表示该方法不需要任何参数。该类包含四个方法:

abstract class Motorcycle
{
    // Anyone can call this.
    public void StartEngine() {/* Method statements here */ }
    // Only derived classes can call this.
    protected void AddGas(int gallons) { /* Method statements here */ }
    // Derived classes can override the base class implementation.
    public virtual int Drive(int miles, int speed) { /* Method statements here */ return 1; }
    // Derived classes must implement this.
    public abstract double GetTopSpeed();
}

方法访问

在对象上调用方法就像访问字段一样。在对象名称后添加句点、方法名称和括号。参数列在括号中并用逗号分隔。因此,可以在下面的例子中调用该类的方法:

class TestMotorcycle : Motorcycle
{
    public override double GetTopSpeed()
    {
        return 108.4;
    }
    static void Main()
    {
        TestMotorcycle moto = new TestMotorcycle();
        moto.StartEngine();
        moto.AddGas(15);
        moto.Drive(5, 20);
        double speed = moto.GetTopSpeed();
        Console.WriteLine("My top speed is {0}", speed);
    }
}

方法形式参与实参

方法定义指定任何必需参数的名称和类型。当调用代码调用方法时,它为每个参数提供了具体的值,称为参数。参数必须与参数类型兼容,但调用代码中使用的参数名称(如果有)不需要与方法中定义的参数名称相同。例如:

public void Caller()
{
    int numA = 4;
    // Call with an int variable.
    int productA = Square(numA);
    int numB = 32;
    // Call with another int variable.
    int productB = Square(numB);
    // Call with an integer literal.
    int productC = Square(12);
    // Call with an expression that evaluates to int.
    productC = Square(productA * 3);
}
int Square(int i)
{
    // Store input argument in a local variable.
    int input = i;
    return input * input;
}

引用传递和值传递

默认情况下,将值类型的实例传递给方法时,传递的是它的副本而不是实例本身。因此,对参数的更改不会影响调用方法中的原始实例。要通过引用传递值类型的实例,请使用 ref 关键字。有关详细信息,请参阅传递值类型参数。

当一个引用类型的对象被传递给一个方法时,一个对该对象的引用被传递。也就是说,该方法接收的不是对象本身,而是指示对象位置的参数。如果使用这个引用改变了对象的成员,即使对象是传值的,改变也会反映在调用方法的参数中。

使用class关键字创建引用类型,如下例所示:

public class SampleRefType
{
    public int value;
}

现在,如果将基于此类型的对象传递给方法,则会传递对该对象的引用。下面的例子将一个类型的对象传递给方法:

public static void TestRefType()
{
    SampleRefType rt = new SampleRefType();
    rt.value = 44;
    ModifyObject(rt);
    Console.WriteLine(rt.value);
}
static void ModifyObject(SampleRefType obj)
{
    obj.value = 33;
}

这个例子与前面的例子基本相同,通过值传递参数给方法。但是因为使用了引用类型,结果就不一样了。对形参 value 的 obj 字段进行的修改也会改变 value 方法中的参数 rt 的字段。该方法显示 33 作为输出。

有关如何通过引用和值传递引用类型的详细信息方法,请参阅传递引用类型参数和引用类型。

返回值

方法可以向调用者返回值。如果方法名前面列出的返回类型不是 void方法,则方法可以使用 void 返回值。带有关键字后跟与返回类型匹配的值的语句将该值返回给方法调用者。

值可以通过值或引用返回给调用者,以C#7.0开头。如果在方法签名中使用了 ref 关键字并且它跟在每个关键字之后,则该值通过引用返回给调用者。例如,下面的方法签名和返回语句指示该方法返回一个通过引用命名的变量给调用者。

public ref double GetEstimatedDistance()
{
    return ref estDistance;
}

关键字也会停止方法的执行。如果返回类型为 void,则仍然可以使用没有值的语句来停止方法的执行。如果没有关键字,方法的执行将在到达代码块末尾时停止。具有非空返回类型的方法都需要使用关键字返回值。例如,这两种方法都使用关键字返回一个整数:

class SimpleMath
{
    public int AddTwoNumbers(int number1, int number2)
    {
        return number1 + number2;
    }
    public int SquareANumber(int number)
    {
        return number * number;
    }
}

要使用从方法返回的值,调用方法可以使用方法调用本身,其中相同类型的值就足够了。返回值也可以分配给变量。例如,以下两个代码示例实现了相同的目标:

int result = obj.AddTwoNumbers(1, 2);
result = obj.SquareANumber(result);
// The result is 9.
Console.WriteLine(result);

result = obj.SquareANumber(obj.AddTwoNumbers(1, 2));
// The result is 9.
Console.WriteLine(result);

在这种情况下,使用局部变量来存储值是可选的。此步骤有助于提高代码的可读性,或者如果您需要在方法的整个范围内存储参数的原始值,则可能需要此步骤。

要使用方法引用返回的值,必须声明变量(如果要修改其值)。例如,如果 .方法通过引用返回一个值,可以将其定义为 ref 局部变量,代码如下:

ref int distance = Planet.GetEstimatedDistance();

如果调用函数将数组传递给M,则不需要从修改数组内容的方法M返回多维数组。您可能会从 M 返回结果数组以获得良好的样式或功能值流,但这是不必要的,因为 C# 按值传递所有引用类型,并且数组引用的值是指向数组的指针。在方法 M 中,任何引用数组的代码都可以观察到数组内容的任何变化,如下例所示:

static void Main(string[] args)
{
    int[,] matrix = new int[2, 2];
    FillMatrix(matrix);
    // matrix is now full of -1
}
public static void FillMatrix(int[,] matrix)
{
    for (int i = 0; i < matrix.GetLength(0); i++)
    {
        for (int j = 0; j < matrix.GetLength(1); j++)
        {
            matrix[i, j] = -1;
        }
    }
}

异步方法

通过使用异步功能,您可以调用异步方法,而无需使用显式回调或在多个方法或表达式之间手动拆分代码。

如果一个方法被标记了 async 修饰符,则可以在该方法中使用 await 运算符。当控制到达异步方法中的 await 表达式时,控制权返回给调用者,并在方法中暂停进度,直到等待任务完成。任务完成后,可以在方法中恢复执行。

注意

当异步方法遇到第一个未完成的对象或到达异步方法结束时,以先发生者为准。

异步方法通常具有 Task、Task 或 void 返回类型。 void 返回类型主要用于定义需要 void 返回类型的事件处理程序。无法等待返回 void 的异步方法,并且返回 void 的方法的调用者无法捕获该方法抛出的异常。从 C# 7.0 开始,允许使用异步方法。

在以下示例中,是一个具有 Task 返回类型的异步方法。有一个返回整数的语句。因此,方法声明必须有一个Task的返回类型。因为返回类型是 Task,所以 await 中的表达式计算结果为整数,如以下语句所示: int = await 。

Main 方法是具有 Task 返回类型的异步方法的示例。它转到方法,并且由于它由单行表示,因此可以省略 async 和 await 关键字。因为是异步方法,所以调用的任务必须等待,如下语句所示:await();。

class Program
{
    static Task Main() => DoSomethingAsync();
    static async Task DoSomethingAsync()
    {
        Task delayTask = DelayAsync();
        int result = await delayTask;
        // The previous two statements may be combined into
        // the following statement.
        //int result = await DelayAsync();
        Console.WriteLine($"Result: {result}");
    }
    static async Task DelayAsync()
    {
        await Task.Delay(100);
        return 5;
    }
}
// Example output:
//   Result: 5

异步方法不能声明任何 ref 或 out 参数,但可以调用具有此类参数的方法。

有关异步方法的详细信息,请参阅使用 Async 和 Await 以及异步返回类型进行异步编程。

表达式主体定义

通常有方法定义立即只返回表达式的结果,或者将单个语句作为方法的主题。这是使用 => 定义此类方法的语法快捷方式:

public Point Move(int dx, int dy) => new Point(x + dx, y + dy);
public void Print() => Console.WriteLine(First + " " + Last);
// Works with operators, properties, and indexers too.
public static Complex operator +(Complex a, Complex b) => a.Add(b);
public string Name => First + " " + Last;
public Customer this[long id] => store.LookupCustomer(id);

如果方法返回 void 或者是异步方法,方法体必须是语句表达式(同 )。对于属性和索引器,两者都必须是只读的,并且不使用 get 访问器关键字。

迭代器

迭代器对集合(例如列表或数组)执行自定义迭代。迭代器使用 yield 语句来返回元素,一次一个。当 yield 语句到达时,会记住代码中的当前位置。下次调用迭代器时,将从该位置继续执行。

使用语句从客户端代码调用迭代器。

迭代器的返回类型可以是 , , 或 .

有关详细信息,请参阅迭代器。

C# 语言规范

有关详细信息,请参阅 C# 语言规范。语言规范是 C# 语法和用法的权威来源。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了