[@倚贤][¥20]什么是值传递和引用传递?
'值传递'和'引用传递'这个称谓,一般是 .NET 平台(C#, F#, VB.NET 等等) 使用的术语。
默认对于 class 类型变量传参是引用传递 - 传递的参数实例的引用;
对于 struct 类型变量的传参是值传递,也可以在加在 ref 声明,指定使用为引用传递;
注意 string 类有那第一点点不寻常,虽然也是按引用传递,但对 string 参数的赋值实际上是将其指向了另一个 string 实例,所以表现起来比较像是按值传递,而实例是按引用传递。
using System;
namespace Demo
{
public struct Student
{
public long Id { get; set; }
public string Name { get; set; }
}
public class Contact
{
public string Name { get; set; }
public string Email { get; set; }
}
public static class Program
{
public static void TestStruct(Student student, int number) // 默认按值传递
{
student.Name = 'student name'; // 此修改不会影响到方法调用者中的 stuct
++number;
}
public static void TestStructByRef(ref Student student, ref int number) // ref 强制改为按引用传递
{
student.Name = 'student name'; // 此修改*会*影响到方法调用者中的 student
++number;
}
public static void TestClass(Contact contact) // 默认按引用传递
{
contact.Name = 'contact name'; // 此修改*会*影响到方法调用者中的 contact
}
public static void TestString(String hello) // 默认按引用传递
{
hello = 'hello, world'; // 此修改不会影响到方法调用者中的 hello
Console.WriteLine(hello); // will print 'hello, world;
}
public static void TestStringOut(out String hello) // 默认按引用传递
{
hello = 'hello, world'; // 此修改不会影响到方法调用者中的 hello
Console.WriteLine(hello); // will print 'hello, world;
}
static void Main(string[] args)
{
Student student = new Student();
student.Name = 'new student';
Console.WriteLine(student.Name);
int number = 0;
TestStruct(student, number); // struct 默认按值传递
Console.WriteLine(student.Name); // will write 'new student' ##
Console.WriteLine(number); // will write 0
Console.WriteLine();
number = 0;
TestStructByRef(ref student, ref number);
Console.WriteLine(student.Name); // will write 'student name' ##
Console.WriteLine(number); // will write 1
Console.WriteLine();
Contact contact = new Contact();
contact.Name = 'new contract';
Console.WriteLine(contact.Name); // will write 'new contact'
TestClass(contact); // class 默认按引用传递
Console.WriteLine(contact.Name); // will write 'contact name' ##
Console.WriteLine();
String hello = 'hello';
TestString(hello);
Console.WriteLine(hello); // will write 'hello';
hello = 'hello';
TestStringOut(out hello);
Console.WriteLine(hello); // will write 'hello world';
}
}
}
赞2
踩0