C# 基础-参数,扩展方法

参数

  1. 传值参数
  2. 输出参数
  3. 引用参数
  4. 数组参数
  5. 具名参数
  6. 可选参数
  7. 扩展方法

值参数

声明时不带修饰符号的形参就是值形参。允许方法将新值赋给参数。这样赋值只影响由该值形参表示的局部变量的存储位置,不影响原实参的值。

传值参数->引用

这种状况很少见,一般情况都是传进来引用它的值,而不是连接到新对象去。

引用参数 ref->值类型

参数采用ref修饰声明。引用形参不创建新的存储位置,调用者的实参所指的存储地址相同,修改数据则一起修改。

引用参数 ref->引用类型

引用参数 -> 引用类型,不创建新对象只改变对象值

不改变对象的hashcode

**注:使用传值参数(不用 ref)结果也将一样,但内部机理不同。 ** 传值参数创建了副本,方法里面的 stu 和 outterStu 不是一个对象,所指向的内存地址不一样,但是存储的地址是相同的,都存储的是 Student 实例在堆内存中的地址。

引用参数 stu 和 outterStu 指向的是同一个内存地址,这个内存地址里面存储的就是 Student 实例在堆内存中的地址。

数组参数 params

  • 必需是形参列表中的最后一个,由 params 修饰
  • 举列:String.Format 方法和 String.Split 方法

使用 params 关键字前:

class Program
{
    static void Main(string[] args)
    {
        var myIntArray = new int[] { 1, 2, 3 };
        int result = CalculateSum(myIntArray);
        Console.WriteLine(result);
    }

    static int CalculateSum(int[] intArray)
    {
        int sum = 0;
        foreach (var item in intArray)
        {
            sum += item;
        }

        return sum;
    }
}

使用 params 后,不再需要单独声明数组:

class Program
{
    static void Main(string[] args)
    {
        int result = CalculateSum(1, 2, 3);
        Console.WriteLine(result);
    }

    static int CalculateSum(params int[] intArray)
    {
        int sum = 0;
        foreach (var item in intArray)
        {
            sum += item;
        }

        return sum;
    }
}

具名参数

具名参数:参数的位置不再受约束。
具名参数的优点:

  • 提高代码可读性
  • 参数的位置不在受参数列表约束

具名参数实例:

class Program
{
    static void Main(string[] args)
    {
        PrintInfo("Tim", 34);

        PrintInfo(age: 24, name:"Wonder");
    }

    static void PrintInfo(string name, int age)
    {
        Console.WriteLine("Helllo {0}, you are {1}.",name,age);
    }
}

可选参数

  • 参数因为具有默认值而变得“可选”
  • 不推荐使用可选参数

拓展方法

当我们无法修改类型源码时,可以通过扩展方法为目标数据类型追加方法。 LINQ 也是扩展方法的一大体现。

无扩展方法:

class Program
{
    static void Main(string[] args)
    {
        double x = 3.14159;
        // double 类型本身没有 Round 方法,只能使用 Math.Round。
        double y = Math.Round(x, 4);
        Console.WriteLine(y);
    }
}

有扩展方法后:

class Program
{
    static void Main(string[] args)
    {
        double x = 3.14159;
        // double 类型本身没有 Round 方法,只能使用 Math.Round。
        double y = x.Round(4);
        Console.WriteLine(y);
    }
}

static class DoubleExtension
{
    public static double Round(this double input,int digits)
    {
        return Math.Round(input, digits);
    }
}

LINQ 实例

class Program
{
    static void Main(string[] args)
    {
        var myList = new List<int>(){ 11, 12, 9, 14, 15 };
        //bool result = AllGreaterThanTen(myList);
        // 这里的 All 就是一个扩展方法
        bool result = myList.All(i => i > 10);
        Console.WriteLine(result);
    }

    static bool AllGreaterThanTen(List<int> intList)
    {
        foreach (var item in intList)
        {
            if (item <= 10)
            {
                return false;
            }
        }

        return true;
    }
}

总结

各种参数的使用场景总结:

  • 传值参数:参数的默认传递方法
  • 输出参数:用于除返回值外还需要输出的场景
  • 引用参数:用于需要修改实际参数值的场景
  • 数组参数:用于简化方法的调用
  • 具名参数:提高可读性
  • 可选参数:参数拥有默认值
  • 扩展方法(this 参数):为目标数据类型“追加”方法
posted @   清风逝  阅读(105)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示