
C# 中 string不是引用类型吗 为什么传递参数后 它的值没改变
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespa...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication14
{
class Program
{
public static void aa(string a ,string b)
{
string c;
c = a;
a = b;
b = c;
Console.WriteLine("a={0},b={1}", a, b);
}
static void Main(string[] args)
{
string x="aaa", y="bbb";
aa( x, y);
Console.WriteLine("x={0},y={1}", x, y);
Console.ReadKey();
}
}
}
既然string的类型是引用 那么输出的结果应该是 a=bbb b=aaa x=bbb y=aaa
可是运行的结果却是 a=bbb b=aaa x=aaa y=bbb 展开
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication14
{
class Program
{
public static void aa(string a ,string b)
{
string c;
c = a;
a = b;
b = c;
Console.WriteLine("a={0},b={1}", a, b);
}
static void Main(string[] args)
{
string x="aaa", y="bbb";
aa( x, y);
Console.WriteLine("x={0},y={1}", x, y);
Console.ReadKey();
}
}
}
既然string的类型是引用 那么输出的结果应该是 a=bbb b=aaa x=bbb y=aaa
可是运行的结果却是 a=bbb b=aaa x=aaa y=bbb 展开
10个回答
展开全部
在C#中,
有两种类型:引用类型(如:string)和非引用类型(如:int)。引用类型指向的其实是一个内存地址,String 虽然是引用类型 不过是不可变的
对字符串做一些操作 比如大小写的转换 += 实际上是重新创建了一个字符串
这也是为什么在做大量字符串拼接的时候要使用StringBuilder 而不用+=
如:
string a = “A”;
a += "B";
这时实际上是相当于重新创建了一个string 对象b,b的值是“AB”。
有两种类型:引用类型(如:string)和非引用类型(如:int)。引用类型指向的其实是一个内存地址,String 虽然是引用类型 不过是不可变的
对字符串做一些操作 比如大小写的转换 += 实际上是重新创建了一个字符串
这也是为什么在做大量字符串拼接的时候要使用StringBuilder 而不用+=
如:
string a = “A”;
a += "B";
这时实际上是相当于重新创建了一个string 对象b,b的值是“AB”。
展开全部
其实问题不在于string是值类型还是引用类型,是你不知道方法内部的参数的赋值与交换,是不影响外部参数的
里面的ab赋值和外面的xy赋值是没有任何关系的,所以你的道德x和y不应该输出成你想象的结果,即使是换成int这种值类型也一样
想要达到你的效果,可以把参数换成ref,比如aaa(ref string a ,ref string b)这样调用的话,a和b的修改会影响到外面的变量
里面的ab赋值和外面的xy赋值是没有任何关系的,所以你的道德x和y不应该输出成你想象的结果,即使是换成int这种值类型也一样
想要达到你的效果,可以把参数换成ref,比如aaa(ref string a ,ref string b)这样调用的话,a和b的修改会影响到外面的变量
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
string不是引用类型,只是一个数据类型,
String str=new String(); 这里这个str才是引用类型。因为这里str是类String的一个对象,对象是引用类型。
String str=new String(); 这里这个str才是引用类型。因为这里str是类String的一个对象,对象是引用类型。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
“基元数据都是值类型”
System.String不是你说的“基元类型”
“你肯定搞错了,如果s是大写的话,那么就是个类类型的,也就是引用类型的,小写的s只会是个值类型的 ”
很不幸,是你搞错了,C#中的string映射的正是System.String,两者没区别,都是类,都是引用类型。
System.String不是你说的“基元类型”
“你肯定搞错了,如果s是大写的话,那么就是个类类型的,也就是引用类型的,小写的s只会是个值类型的 ”
很不幸,是你搞错了,C#中的string映射的正是System.String,两者没区别,都是类,都是引用类型。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
想达到你要的目的你可以这样修改。
1、方法头 :public static void aa( ref string a, ref string b )
2、方法调用:aa( ref x, ref y );
这样修改后就是将 x,y 按引用传值。得到的结果就是你要的。
至于原理楼上的几位说的很清楚了。
1、方法头 :public static void aa( ref string a, ref string b )
2、方法调用:aa( ref x, ref y );
这样修改后就是将 x,y 按引用传值。得到的结果就是你要的。
至于原理楼上的几位说的很清楚了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询