求指点byte[] 是引用类型还是值类型

爱在今世 2017-06-12 05:01:24
RT,按说数组属于对象,一般是引用类型的。但是我测试出来一个奇怪的事情,代码如下
public static void run19()
{

byte[] by = new byte[4];
by = Encoding.UTF8.GetBytes("天真");
run20(by);
System.Console.WriteLine(Encoding.UTF8.GetString(by));
}

public static void run20(byte[] by)
{
by = Encoding.UTF8.GetBytes("天才");
}

最后输出的结果是天真,那不就是值类型?
但是改了一下代码后
public static void run19()
{

byte[] by = new byte[4] { 1, 2, 3, 4 };
run20(by);
System.Console.WriteLine(by[2]);
}

public static void run20(byte[] by)
{
by[2] = 100;
}

输出的结果是100,那不就是引用类型?
迷茫了,求各位大神指点一下究竟是怎么回事?
...全文
1536 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
capricorn1245 2019-11-07
  • 打赏
  • 举报
回复 3
这个和函数调用参数传递有关,引用类型分为两部分,地址+真实内容。引用类型作为参数传递时,是复制它的地址。 第一个方法,public static void run20(byte[] by) 这里面传递过来的by,是 by = Encoding.UTF8.GetBytes("天真") 是这个by数组的地址的---复制品,当执行代码by = Encoding.UTF8.GetBytes("天才");时,这个复制的地址,指向了“天才”这个新的内容,注意,是这个复制的地址,不是原来的那个地址。所有打印输出by时,这个是原地址,原地址指向的内容,“天真”没有任何改变,所以输出了天真。 第二个方法,传递到方法内的by,也是by数组的地址的---复制品,他指向的是{1,2,3,4},而执行by[2] = 100;代码时,是修改这个地址指向的数组的内容{1,2,3,4}使其变成{1,100,2,3},所以当输出by[2]时,原地址也是指向这个内容,所有它输出的就是100了
两水先木示 2019-05-19
  • 打赏
  • 举报
回复
我觉得很奇怪,按道理说应该是改变了的,毕竟引用类型就是存入栈,第一个例子 确实会更新栈中的by的指向的啊。。神了
闭包客 2017-06-12
  • 打赏
  • 举报
回复
有趣的是引用类型是可以包含值类型的,值类型里面也可以包含引用类型。
正怒月神 2017-06-12
  • 打赏
  • 举报
回复
或许你看一下这个代码,就更直观了
static void Main(string[] args)
        {
            run19();

            Console.ReadLine();
        }

        public static void run19()
        {

            List<int> a = new List<int>() { 1,2,3,4};
            run20(a);
            System.Console.WriteLine(string.Join(",", a));
            run21(a);
            System.Console.WriteLine(string.Join(",",a));
        }

        public static void run20(List<int> a)
        {
            a = new List<int>() { 100,200,300};
        }

        public static void run21(List<int> a)
        {
            a[1] = 0;
        }
正怒月神 2017-06-12
  • 打赏
  • 举报
回复
public static void run20(byte[] by)
{
by = Encoding.UTF8.GetBytes("天才");
}
其实你对by整个赋值的时候,就已经不是之前的对象了。
这类似于产生了一个新的对象
by=new Byte[] 这样。所以对于原来的by是没有任何改变的。


而最后的 by[1]=100这个就好理解了。这的确是对引用中的值进行了操作
本人QQ-554433626 2017-06-12
  • 打赏
  • 举报
回复 1
二次赋值 如果第二次赋的值是全局,将使用第一次的赋值
爱在今世 2017-06-12
  • 打赏
  • 举报
回复
引用 3 楼 xiaoxiangqing 的回复:
byte[] 是引用类型,数组全部是引用类型
我也记得数组就是引用类型,但是第一个例子如何解释呢?
xiaoxiangqing 2017-06-12
  • 打赏
  • 举报
回复
byte[] 是引用类型,数组全部是引用类型
爱在今世 2017-06-12
  • 打赏
  • 举报
回复
引用 1 楼 hanjun0612 的回复:
数组就是引用类型
我也记得数组就是引用类型,但是第一个例子如何解释呢?
正怒月神 2017-06-12
  • 打赏
  • 举报
回复
数组就是引用类型

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧