VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2109|回复: 17

string ,值类型 引用类型的问题

[复制链接]

1

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-1-3 10:10:01 | 显示全部楼层 |阅读模式
看这道题
using System;
class Class1  {

static void StringConvert(string str)
         {
           str = "string being converted.";
      }
static void Main()
         {
string str1 = "str";

StringConvert(str1);
  Console.WriteLine(str1);
}
}

  结果输出是 : str

  还是关于值类型和引用类型
    都知道string 是引用类型的 ,这题我有点想不通,各位指点下
我的想法 :

1,str1 指向托管堆中的string类型值为str;
2,内存中静态方法StringConvert调用str1(由于是引用,它必须是string类型)
3,由于str1在方法中被修改 ,在托管堆中重新分配一块 string类型空间,str1指向被修改的内存 即 "string being converted.";至于原来的"str"不知道被谁指向
4,Console.WriteLine 方法调用str1的指向的内存,既输出"string being converted.";




疑惑 :
str1在修改后还是指向"str",那修改后的 "string being converted.";这段内存被谁指向,好象不见了,怎么输出
回复

使用道具 举报

0

主题

8

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-1-3 10:39:01 | 显示全部楼层
C#的string有点特殊,它实际上是一个值类型,但是拥有某些引用类型的特征,也就是说在它本质外面被包装了一层对象特征.
回复

使用道具 举报

1

主题

18

帖子

14.00

积分

新手上路

Rank: 1

积分
14.00
发表于 2020-1-3 10:42:01 | 显示全部楼层
string是特殊的引用类型,
string str1 = "str";
static void StringConvert(string str)
{
str = "string being converted.";
}
在StringConvert函数内str="string being converted.";是另个一个string,
当调用StringConvert函数时,str传参,并不是传入引用,而是另个复制了一个string,
原来的string并没有改变
回复

使用道具 举报

1

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-1-3 10:48:01 | 显示全部楼层
有点明白了
和static void StringConvert(int i)
{

}
是一个道理吧
回复

使用道具 举报

1

主题

18

帖子

14.00

积分

新手上路

Rank: 1

积分
14.00
发表于 2020-1-3 11:06:01 | 显示全部楼层
基本上是吧
回复

使用道具 举报

0

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-3 13:54:01 | 显示全部楼层
用 ref 阿;
回复

使用道具 举报

0

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-3 13:57:01 | 显示全部楼层
using System;
class Class1  {

static void StringConvert(ref string str)
         {
           str = "string being converted.";
      }
static void Main()
         {
string str1 = "str";

StringConvert(ref str1);
  Console.WriteLine(str1);
}
}
回复

使用道具 举报

0

主题

56

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-1-3 14:12:01 | 显示全部楼层
引用类型为 handle/object 对, handle相当于指针,object为托管堆上的一块内存空间,
static void StringConvert(string str) 参数传过来的是一个handle,
函数体内的str实际只是外部strl这个引用类型的handle的一个副本,改变str指向的内容并不影响str1的指向.
回复

使用道具 举报

0

主题

8

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-3 14:39:01 | 显示全部楼层
str和str1指向的是同一个东西,是同一个东西的引用,但他们本身却不是同一个东西。

而在之后的:
str = "string being converted.";

把str指向了另一个东西,而str1仍然指向"str"。

string的特殊性在于其对象不可修改,而它确实是引用类型的。

正如同,你这样试验是看不出数组是引用类型的:

int[] arr = new int[]{0,1};

int[] arr1 = arr;
arr1 = new int[0];

难道arr1的赋值会影响到arr?

但是,这样我们可以看出数组是引用类型:

int[] arr = new int[]{0,1};

int[] arr1 = arr;
arr[0] = 5;

但是,对于string类型而言,根本就没有这样的方法。所以看不出。


至于像一楼那种胡说八道的家伙你完全可以不必理会……
回复

使用道具 举报

0

主题

110

帖子

63.00

积分

新手上路

Rank: 1

积分
63.00
发表于 2020-1-3 15:09:01 | 显示全部楼层
string是引用类型,这个不用怀疑,但与其他引用类型,又有一定的特殊性..

至于原因,楼上的芬恩克莱尔 大哥已说得很清楚了..
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表