在 C# 中使用带有参数的 in、out 和 ref
介绍
在本指南中,我们将研究在 C# 方法中将引用和值类型作为参数传递时使用in、out和ref之间的区别。这些技术允许您更改 C# 在方法中以及方法外部处理数据更改的方式。
在阅读本文之前,您应该对传递引用和值类型有所了解。
in、ref 和 out 修饰符
方法参数具有可用的修饰符,可以更改参数处理方式的期望结果。每种方法都有特定的用例:
ref用于声明传递的参数可以被方法修改。
in用于声明传递的参数不能被方法修改。
out用于声明传递的参数必须由方法修改。
ref和in都要求在将参数传递给方法之前对其进行初始化。out修饰符不需要这样做,并且通常在方法中使用之前不会对其进行初始化。
ref 修饰符
默认情况下,传入方法的引用类型的值的任何更改都会反映在方法外部。如果您在方法内部将引用类型分配给新的引用类型,则这些更改将仅限于方法本地。请参阅我的 Pluralsight 指南“传递引用与值”以获取示例。使用ref修饰符,您可以选择分配新的引用类型并将其反映在方法外部。
class ReferenceTypeExample
{
static void Enroll(ref Student student)
{
// With ref, all three lines below alter the student variable outside the method.
student.Enrolled = true;
student = new Student();
student.Enrolled = false;
}
static void Main()
{
var student = new Student
{
Name = "Susan",
Enrolled = false
};
Enroll(ref student);
// student.Name is now null since a value was not passed when declaring new Student() in the Enroll method
// student.Enrolled is now false due to the ref modifier
}
}
public class Student {
public string Name {get;set;}
public bool Enrolled {get;set;}
}
使用ref修饰符,您还可以更改方法外部的值类型。
class ReferenceTypeExample
{
static void IncrementExample(ref int num)
{
num = num + 1;
}
static void Main()
{
int num = 1;
IncrementExample(ref num);
// num is now 2
}
}
out 修饰符
使用out修饰符,我们在方法内部初始化一个变量。与ref一样,方法中发生的任何事情都会改变方法外部的变量。使用ref,您可以选择不更改参数。使用out时,您必须初始化在方法内部传递的参数。传入的参数通常为 null。
class ReferenceTypeExample
{
static void Enroll(out Student student)
{
//We need to initialize the variable in the method before we can do anything
student = new Student();
student.Enrolled = false;
}
static void Main()
{
Student student;
Enroll(out student); // student will be equal to the value in Enroll. Name will be null and Enrolled will be false.
}
}
public class Student {
public string Name {get;set;}
public bool Enrolled {get;set;}
}
out修饰符也适用于值类型。一个有用的例子是使用out修饰符将字符串更改为 int。
int x;
Int32.TryParse("3", out x);
in 修饰符
in修饰符最常用于提高性能,它是在 C# 7.2 中引入的。使用in的动机是与结构一起使用,通过声明值不会被修改来提高性能。当与引用类型一起使用时,它只会阻止您分配新的引用。
class ReferenceTypeExample
{
static void Enroll(in Student student)
{
// With in assigning a new object would throw an error
// student = new Student();
// We can still do this with reference types though
student.Enrolled = true;
}
static void Main()
{
var student = new Student
{
Name = "Susan",
Enrolled = false
};
Enroll(student);
}
}
public class Student
{
public string Name { get; set; }
public bool Enrolled { get; set; }
}
并非所有方法都允许使用修饰符
需要注意的是,in、out和ref不能用于带有async修饰符的方法中。不过,你可以在返回任务的同步方法中使用它们。
您不能在具有Yield Return或Yield Break的迭代器方法中使用它们。
使用修饰符重载方法
在 C# 中重载方法时,使用修饰符将被视为与不使用修饰符不同的方法签名。如果方法之间的唯一区别在于所用修饰符的类型,则无法重载方法。这将导致编译错误。
结论
了解这些简单的技巧可以使您的代码更容易理解和阅读。
要了解有关在 C# 中传递引用类型、值类型和其他类型的更多信息,请查看Scott Allen 撰写的《加速 C# 基础知识》。别忘了尝试C# 路径,看看你的技能处于什么水平以及在哪些方面可以提高!
关于作者
Matt Ferderer 是一名软件开发人员,他在推特、帖子和博客上发布有关网络开发的信息。
了解更多
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~