在C#中,当类作为参数进行传递时,如果参数修改时,一定会修改类成员的值吗? 1.一直以来,都有这么个概念,引用类型,都是按照引用来传递的。2.所以,类是引用类型 ,那么,当类作为参数进行传递时,如果参数修改时,一定会修改类成员的值吗?3.我今天发现,不一定欧!有时,当类作为参数进行传递时, ,如果参数修改时,不一定会修改类成员的值!! 我不知道,我说的对不对!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 建议看下,,现在正在激烈讨论的帖子C#中的string到底是什么类型?http://topic.csdn.net/u/20090722/19/356762ca-d13a-4e69-a2b5-9a19a0182d46.html?86710 string不用谈,虽然是引用类型,当值类型使用 STRING 类型不加REF是不会变的, 大哥们,有空提高下基本功吧。 class Program { public static void ChangeString(string str) { str = "This is ChangeString"; } static void Main(string[] args) { string test; test = "This is Main"; ChangeString(test); Console.WriteLine(test); } }对应的IL代码是:.method private hidebysig static void Main(string[] args) cil managed{ .entrypoint // 代码大小 22 (0x16) .maxstack 1 .locals init (string V_0) IL_0000: nop IL_0001: ldstr "This is Main" IL_0006: stloc.0 IL_0007: ldloc.0 IL_0008: call void cs35.Program::ChangeString(string) IL_000d: nop IL_000e: ldloc.0 IL_000f: call void [mscorlib]System.Console::WriteLine(string) IL_0014: nop IL_0015: ret} // end of method Program::Main红色部分表示获取本地局部变量。.method public hidebysig static void ChangeString(string str) cil managed{ // 代码大小 9 (0x9) .maxstack 8 IL_0000: nop IL_0001: ldstr "This is ChangeString" IL_0006: starg.s str IL_0008: ret} // end of method Program::ChangeString红色标记的地方表示存储到调用堆栈上,方法退出以后自然不可能影响到外面的代码了。再来看看ref版的代码 class Program { public static void ChangeString(ref string str) { str = "This is ChangeString"; } static void Main(string[] args) { string test; test = "This is Main"; ChangeString(ref test); Console.WriteLine(test); } }.method private hidebysig static void Main(string[] args) cil managed{ .entrypoint // 代码大小 23 (0x17) .maxstack 1 .locals init ([0] string test) IL_0000: nop IL_0001: ldstr "This is Main" IL_0006: stloc.0 IL_0007: ldloca.s test IL_0009: call void cs35.Program::ChangeString(string&) IL_000e: nop IL_000f: ldloc.0 IL_0010: call void [mscorlib]System.Console::WriteLine(string) IL_0015: nop IL_0016: ret} // end of method Program::Main红色部分表示获取变量的引用!.method public hidebysig static void ChangeString(string& str) cil managed{ // 代码大小 9 (0x9) .maxstack 8 IL_0000: nop IL_0001: ldarg.0 IL_0002: ldstr "This is ChangeString" IL_0007: stind.ref IL_0008: ret} // end of method Program::ChangeString红色部分表示存储一个引用。 不是不一定会,而是一定会~除非你在方法里面New了个新的实例,做了且做了深拷贝~ 如果要在 .htm文件里 通过判断session里面的值,来是否显示某个东西 c#如何把自己解决方案里面的某个文件复制到指定目录 救济 WebService的调用地址配置问题 关于vs2010混淆工具dotfuscator? 紧急求救:关于url中有多个参数,其中有参数值包含&的问题 100分求一个在richtextbox插入图片的方法.不能用粘贴.找到答案马上结帖! SOAP & C# C#模拟提交表单但是表单中有附件上传,我已经解决上传一个附件的办法了。可是! 请问C#中随机函数是什么?如何用啊? 关于webbrowser的问题,我分不多了,高手进来啦。。。 比较ASCII码大小
http://topic.csdn.net/u/20090722/19/356762ca-d13a-4e69-a2b5-9a19a0182d46.html?86710
{
public static void ChangeString(string str)
{
str = "This is ChangeString";
}
static void Main(string[] args)
{
string test;
test = "This is Main";
ChangeString(test);
Console.WriteLine(test);
}
}对应的IL代码是:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 22 (0x16)
.maxstack 1
.locals init (string V_0)
IL_0000: nop
IL_0001: ldstr "This is Main"
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: call void cs35.Program::ChangeString(string)
IL_000d: nop
IL_000e: ldloc.0
IL_000f: call void [mscorlib]System.Console::WriteLine(string)
IL_0014: nop
IL_0015: ret
} // end of method Program::Main红色部分表示获取本地局部变量。.method public hidebysig static void ChangeString(string str) cil managed
{
// 代码大小 9 (0x9)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "This is ChangeString"
IL_0006: starg.s str
IL_0008: ret
} // end of method Program::ChangeString红色标记的地方表示存储到调用堆栈上,方法退出以后自然不可能影响到外面的代码了。再来看看ref版的代码 class Program
{
public static void ChangeString(ref string str)
{
str = "This is ChangeString";
}
static void Main(string[] args)
{
string test;
test = "This is Main";
ChangeString(ref test);
Console.WriteLine(test);
}
}.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 23 (0x17)
.maxstack 1
.locals init ([0] string test)
IL_0000: nop
IL_0001: ldstr "This is Main"
IL_0006: stloc.0
IL_0007: ldloca.s test
IL_0009: call void cs35.Program::ChangeString(string&)
IL_000e: nop
IL_000f: ldloc.0
IL_0010: call void [mscorlib]System.Console::WriteLine(string)
IL_0015: nop
IL_0016: ret
} // end of method Program::Main
红色部分表示获取变量的引用!.method public hidebysig static void ChangeString(string& str) cil managed
{
// 代码大小 9 (0x9)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldstr "This is ChangeString"
IL_0007: stind.ref
IL_0008: ret
} // end of method Program::ChangeString红色部分表示存储一个引用。
除非你在方法里面New了个新的实例,做了且做了深拷贝~