知识点:
值类型:存储于 堆栈中,传递的是“值”。如:基本数据类型、结构、枚举。。
引用类型:存储于 托管堆中,传递的是“引用(地址)”,如:类、OBJECT、字符串、数组
ref
关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace test
{
class ArrayClass
{
static void PrintArray(string[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
System.Console.Write(arr[i] + "{0}", i < arr.Length - 1 ? " " : "");
}
System.Console.WriteLine();
}
static void ChangeArray(string[] arr)
{
//string[] s = new string[7];
arr = (arr.Reverse()).ToArray(); //就像蓝色代码所示,新建了一个数组对象s,s指向了arr反转后的数组。
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace test
{
class ArrayClass
{
static void PrintArray(string[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
System.Console.Write(arr[i] + "{0}", i < arr.Length - 1 ? " " : "");
}
System.Console.WriteLine();
}
static void ChangeArray(string[] arr)
{
//string[] s = new string[7];
arr = (arr.Reverse()).ToArray(); //就像蓝色代码所示,新建了一个数组对象s,s指向了arr反转后的数组。
//s = (arr.Reverse()).ToArray();
System.Console.WriteLine("reverse:");
PrintArray(arr);
System.Console.WriteLine("arr[0] is {0} in ChangeArray.", arr[0]);
//System.Console.WriteLine("s[0] is {0} in ChangeArray.", s[0]);
// return arr;
}
static void ChangeArrayElements(string[] arr)
{
//string[] s = new string[7];
//s[0] = "Sat";
// s[1] = "Fri";
//s[2] = "Thu";
// arr[0] = s[0];
// arr = s;//C#中数组可以整体赋值?不是,只是指向发生了变化。
arr[0] = "Sat";
arr[1] = "Fri";
arr[2] = "Thu";
PrintArray(arr);
System.Console.WriteLine("arr[0] is {0} in ChangeArrayElements.", arr[0]);
}
static void Main()
{
// Declare and initialize an array.
string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
//string[] s = new string[7];
//s = weekDays;
System.Console.WriteLine("Initialize:");
PrintArray(weekDays);
ChangeArray( weekDays);
System.Console.WriteLine("Array weekDays after the call to ChangeArray:");
PrintArray(weekDays);
System.Console.WriteLine();
System.Console.WriteLine("reverse:");
PrintArray(arr);
System.Console.WriteLine("arr[0] is {0} in ChangeArray.", arr[0]);
//System.Console.WriteLine("s[0] is {0} in ChangeArray.", s[0]);
// return arr;
}
static void ChangeArrayElements(string[] arr)
{
//string[] s = new string[7];
//s[0] = "Sat";
// s[1] = "Fri";
//s[2] = "Thu";
// arr[0] = s[0];
// arr = s;//C#中数组可以整体赋值?不是,只是指向发生了变化。
arr[0] = "Sat";
arr[1] = "Fri";
arr[2] = "Thu";
PrintArray(arr);
System.Console.WriteLine("arr[0] is {0} in ChangeArrayElements.", arr[0]);
}
static void Main()
{
// Declare and initialize an array.
string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
//string[] s = new string[7];
//s = weekDays;
System.Console.WriteLine("Initialize:");
PrintArray(weekDays);
ChangeArray( weekDays);
System.Console.WriteLine("Array weekDays after the call to ChangeArray:");
PrintArray(weekDays);
System.Console.WriteLine();
ChangeArrayElements(weekDays);
System.Console.WriteLine("Array weekDays after the call to ChangeArrayElements:");
PrintArray(weekDays);
}
}
}
红字标识部分-----ChangeArray() 没有改变 原数组的值。而ChangeArrayElements()方法改变了原数组的值。
1.开始我没理解过来的是数组是引用型类型,因此方法可以更改元素的值。
可是两个方法传递的都是数组类型。
2.函数调用的时候就像新建了一个数组对象arr,这个对象是WeekDays的复制版,同样指向 string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };这个建立的时候开辟出来的内存。
而ChangeArray()方法的这句话 arr = (arr.Reverse()).ToArray();开辟出来另一块空间,而arr不指向WeekDays开辟出来的内存了,而是指向了这句话开辟出来的内存。
ChangeArrayElements()呢,arr的指向并没有改变,
s[0] = "Sat";
s[1] = "Fri";
s[2] = "Thu";这三句话是把string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };这个建立的时候开辟出来的内存里面的内容改变了。所以在后来访问的时候Weekdays的值发生了变化。
s[2] = "Thu";这三句话是把string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };这个建立的时候开辟出来的内存里面的内容改变了。所以在后来访问的时候Weekdays的值发生了变化。
要实现ChangeArray()方法中arr的指向不发生改变,就这样操作ChangeArray(ref string[] arr),这样就把WeekDays所开辟出来的内存一并传递给了ChangeArray()方法,所有的操作也会在那片内存中进行。
参考:
感谢caozhy,Mr.song
本文探讨了C#中数组作为参数传递时的行为差异,通过两个示例方法对比了直接修改数组元素与重新分配数组的区别,解释了引用类型的工作原理。
841

被折叠的 条评论
为什么被折叠?



