C#(也适用其他)的初学者对string是值类型还是引用类型搞不清楚,还有对参数传递也比较迷糊

 通过这个例子可能有点帮助

using  System;
using  System.Reflection;
using  System.Runtime.InteropServices;

namespace  StringTest
{
    
public class StringTest
    
{
        [STAThread]
        
static void Main() 
        
{
            StringTest tester 
= new StringTest();
            
string str = "a test string.";
            
string str1 = "a test string.";//和str一样的值。
            string str2 = str;
            Console.WriteLine(
"str = " + str);        //输出:a test string.
            Console.WriteLine("str1 = " + str1);    //输出:a test string.
            Console.WriteLine("str2 = " + str2);    //输出:a test string.
            Console.WriteLine(" ");
            
//使用反射技术把字符串的第4个字符修改为“E”
            typeof(string).InvokeMember("SetChar", BindingFlags.Default | BindingFlags.NonPublic | BindingFlags.Instance |BindingFlags.InvokeMethod, null, str, new object[]{3'E'});

            Console.WriteLine(
"str = " + str);        //输出:a tEst string.
            Console.WriteLine("str1 = " + str1);    //输出:a tEst string.
            Console.WriteLine("str2 = " + str2);    //输出:a tEst string.
            
//从上面的试验很清楚地看出string是引用类型,因为str,str1,str2 只有都指向一个对象,才会同时改变
                //可见在.NET中值相同的字符串在内存中是共用的。
            Console.WriteLine(" ");

            str2 
= "aa";        //把str2的值修改为“aa”
            tester.Test1(str1); //调用方法Test1
            Console.WriteLine("str = " + str);        //输出:a tWst string.
            Console.WriteLine("str1 = " + str1);    //输出:a tWst string.
            Console.WriteLine("str2 = " + str2);    //输出:aa
            Console.WriteLine(" ");
            
//从上面的试验可以看出,字符串的赋值运算符是新建一个对象,而不是修改原来对象的值
            
//还可以看出通过值传递引用类型参数时,传递的是对其数据的引用,而不是数据本身

            tester.Test2(
ref str);
            Console.WriteLine(
"str = " + str);    //输出:abcM
            Console.WriteLine("str1 = " + str1);//输出:a tWst string.
            Console.WriteLine("str2 = " + str2);//输出:aa.
            Console.WriteLine(" ");
            
//从上面的试验可以看出通过引用传递引用类型的作用:
            
//ref 方法参数关键字使方法引用传递到方法的同一个变量(既str)。
            
//在方法(Test2)中对参数所做的任何更改(src = "abcd")都将反映在该变量中(str)。
        }

        
public void Test1(string src)
        
{
            
//使用反射技术把字符串的第4个字符修改为“W”
            typeof(string).InvokeMember("SetChar", BindingFlags.Default | BindingFlags.NonPublic | BindingFlags.Instance |BindingFlags.InvokeMethod, null, src, new object[]{3'W'});
            src 
= "abcd";
        }


        
public void Test2(ref string src)
        
{
            src 
= "abcd";
            
//使用反射技术把字符串的第4个字符修改为“M”
            typeof(string).InvokeMember("SetChar", BindingFlags.Default | BindingFlags.NonPublic | BindingFlags.Instance |BindingFlags.InvokeMethod, null, src, new object[]{3'M'});
        }

    }

}

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值