如何将网站添加到信任站点,wordpress调用第一张图片不显示,wordpress无法进入文章,上海百度网站建设总目录 前言
在 C# 编程中#xff0c;ref 和 out 是两个非常重要的关键字#xff0c;它们都用于方法参数的传递#xff0c;但用途和行为却有所不同。今天#xff0c;我们就来深入探讨一下这两个关键字的用法和区别#xff0c;让你在编程中能够得心应手地使用它们。 一、什…总目录 前言
在 C# 编程中ref 和 out 是两个非常重要的关键字它们都用于方法参数的传递但用途和行为却有所不同。今天我们就来深入探讨一下这两个关键字的用法和区别让你在编程中能够得心应手地使用它们。 一、什么是 ref 和 out
在 C# 中方法的参数默认是通过值传递的这意味着方法内部对参数的修改不会影响到外部的变量。但有时候我们希望方法能够修改外部变量的值或者需要返回多个值。这时候ref 和 out 就派上用场了。
ref表示引用传递。它允许方法修改传入的变量的值并且这些修改会反映到外部变量上。out也表示引用传递但它主要用于返回多个值。与 ref 不同的是out 参数在传入方法之前不需要初始化。
二、传值赋值和传址赋值
传值赋值赋值运算符操作的是值类型数据或字符串传址/引用赋值赋值运算符操作的是引用类型数据除字符串
class User
{public string Id { get; set; }public string Name { get; set; }public string Sex { get; set; }
}class Program
{static void Main(){// 值类型 和 string int num 10;string text hello;ChangeValue(num,text);Console.WriteLine(num); // 输出10原值纹丝不动Console.WriteLine(text); // 输出hello原值纹丝不动// 引用类型 除 stringUser user new User() { Id 1, Name 鲲籽鲤, Sex 男 };UpdateUser(user);Console.WriteLine($User.Id{user.Id}User.Name{user.Name});// 输出User.Id2User.Name鲤籽鲲}static void ChangeValue(int x,string str){x 100;str ni hao;}static void UpdateUser(User user){user.Id 2;user.Name 鲤籽鲲;}
}通过以上案例可知
在对值类型以及字符串进行赋值的时候是将值进行的复制。在对引用类型除字符串进行赋值的时候是将数据内容的索引或地址进行的复制
二、ref 的使用
1. 基本用法
ref 参数必须在调用方法之前初始化。我们来看一个简单的例子
public void IncreaseValue(ref int value)
{value 10;
}// 调用示例
int myNumber 5;
IncreaseValue(ref myNumber);
Console.WriteLine(myNumber); // 输出15在这个例子中myNumber的值被方法IncreaseValue增加到了15。因为ref传递的是引用所以对value的任何修改都会反映到myNumber上。
public void Swap(ref int a, ref int b)
{int temp a;a b;b temp;
}int x 10;
int y 20;
Swap(ref x, ref y);
Console.WriteLine($x: {x}, y: {y}); // 输出x: 20, y: 10在这个例子中Swap 方法通过 ref 参数交换了两个整数的值。调用方法时我们需要在参数前加上 ref 关键字并且变量 x 和 y 必须在调用之前初始化。
2. 注意事项
必须初始化ref 参数在传入方法之前必须被赋值否则会报编译错误。修改外部变量ref 参数允许方法修改外部变量的值这可能会导致意外的副作用所以使用时要小心。
三、out 的使用
1. 基本用法
out 参数主要用于返回多个值它在传入方法之前不需要初始化但方法内部必须为 out 参数赋值。来看一个例子
public void GetMinMax(int[] numbers, out int min, out int max)
{min numbers[0];max numbers[0];foreach (int num in numbers){if (num min) min num;if (num max) max num;}
}int[] numbers { 5, 2, 9, 1, 7 };
int min, max;
GetMinMax(numbers, out min, out max);
Console.WriteLine($Min: {min}, Max: {max}); // 输出Min: 1, Max: 9在这个例子中GetMinMax 方法通过 out 参数返回了数组中的最小值和最大值。调用方法时我们只需要声明变量 min 和 max而不需要在调用之前初始化它们。
public void Divide(int dividend, int divisor, out int quotient, out int remainder)
{quotient dividend / divisor;remainder dividend % divisor;
}// 调用示例
Divide(10, 3, out int quotient, out int remainder);
Console.WriteLine($Quotient: {quotient}, Remainder: {remainder});
// 输出Quotient: 3, Remainder: 1Divide方法不仅计算了商quotient还计算了余数remainder。注意我们在调用时声明了两个out变量并且在方法内部都进行了赋值。
2. 注意事项
无需初始化out 参数在传入方法之前不需要初始化方法内部必须为 out 参数赋值。返回多个值out 参数非常适合用于返回多个值但过多的 out 参数可能会使代码变得复杂可读性降低。
四、ref 和 out 的区别
特性refout初始化要求必须在传入方法之前初始化不需要初始化方法内部必须赋值方法内赋值可改可不改方法内可以不修改值但通常建议修改必须赋值用途修改外部变量的值返回多个值调用方式调用时和方法定义时都需要加 ref调用时和方法定义时都需要加 out语义输入输出纯输出 使用ref可以让方法读取和修改传入参数的值但需要先初始化。使用out可以在方法中返回额外的结果而不需要提前初始化参数但方法内必须对out参数赋值。out 更侧重输出即是说将传进方法的参数自行在内部赋值然后给到外部使用正因它是必须在内部赋值所以它不在乎该变量是否有初始值ref 更侧重修改即是说传进方法的参数本身就有值在方法内部对变量值进行修改它只是对变量的值进行修改因此他要求变量必须有初始值 五、应用场景
1. TryParse模式经典out用法
if(int.TryParse(123, out var result))
{// 安全使用result
}2. 大结构体优化ref高级用法
void 处理大结构(ref BigStruct data)
{// 避免值类型复制开销
}3. Swapper工具ref炫技
void Swap(ref int a, ref int b)
{(a, b) (b, a);
}五、in 关键字补充
从 C# 7.2 开始引入了 in 关键字。它用于传递只读引用方法内部不能修改传入的参数值。这在传递大型结构体时可以提高性能同时保证数据的安全性。
public void Print(in Person person)
{Console.WriteLine(person.Name);// person.Name New Name; // 编译错误不能修改
}六、注意事项
用out时代替多返回值更优雅异步方法中禁止使用属性不能作为参数传递编译直接报错重载方法时ref和out算不同签名ref适用游戏角色属性修改、实时数据更新out适用数据解析、状态检测返回多值 结语
回到目录页C#/.NET 知识汇总 希望以上内容可以帮助到大家如文中有不对之处还请批评指正。