C# 基础-参数,扩展方法
参数
- 传值参数
- 输出参数
- 引用参数
- 数组参数
- 具名参数
- 可选参数
- 扩展方法
值参数
声明时不带修饰符号的形参就是值形参。允许方法将新值赋给参数。这样赋值只影响由该值形参表示的局部变量的存储位置,不影响原实参的值。
传值参数->引用
这种状况很少见,一般情况都是传进来引用它的值,而不是连接到新对象去。
引用参数 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 参数):为目标数据类型“追加”方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律