C#将字符串作为参数传递给方法并在其中更新不反映原始字符串值的变化

时间:2017-04-27 05:21:10

标签: c# string value-type reference-type

我知道String是一个引用类型。我的问题是为什么它的行为类似于价值类型?

根据我的理解,引用类型存储堆栈中堆的内存位置。因此,如果string是引用类型,那么它应该像任何引用类型对象(如类)一样。

为了检查,我写了以下代码:

static String justtest = new String('h', 1);
    public static void Method1(String source) 
    {
        source= source.ToUpper();
        Console.WriteLine(source);
    }

    public static void Method2(ReferenceClass me)
    {
        me.MyProperty = 100 + " Test";
    }

    static void Main(string[] args)
    {        
        Method1(justtest);
        Console.WriteLine("Value of String: {0}", justtest);            

        ReferenceClass obj1 = new ReferenceClass();
        obj1.MyProperty = "50";
        Method2(obj1);
        Console.WriteLine("Value of property: {0}", obj1.MyProperty);

        Console.ReadKey();
    }

    public class ReferenceClass {
        public string MyProperty;
    }

所以它显示结果如下:

    Value of String: h
    Value of property: 100 Test

此处属性值已更新但未更新字符串值。因此,对于我正在传递给下面代码的方法的字符串,chrew引用是否相同:

    static String justtest = new String('h', 1);
    public static void Method1(String source) 
    {
        bool isequalref = ReferenceEquals(source, justtest);
        source= source.ToUpper();
        bool referenceNotEqual = ReferenceEquals(source, justtest);            
    }

    public static void Method2(ReferenceClass me)
    {
        me.MyProperty = 100 + " Test";
    }

    static void Main(string[] args)
    {        
        Method1(justtest);
        Console.WriteLine("Value of String: {0}", justtest);            

        ReferenceClass obj1 = new ReferenceClass();
        obj1.MyProperty = "50";
        Method2(obj1);
        Console.WriteLine("Value of property: {0}", obj1.MyProperty);

        Console.ReadKey();
    }

    public class ReferenceClass {
        public string MyProperty;
    }

输出相同,但在调试时我发现isequalref的值为true,而referenceNotEqual值为false。

所以我有点混淆,因为string是不可变对象所以当我们尝试更新它时会创建新对象并引用其他位置。是这样吗 ?如果是,那么为什么它在主方法中没有更新值?如果我们以相同的方法(main)更新字符串,那么它也会创建新对象,但字符串将具有新值。像..

    static void Main(string[] args)
    {        
        Method1(justtest);
        Console.WriteLine("Value of String: {0}", justtest);            
        justtest = "Hello World";
        Console.WriteLine("Value of String: {0}", justtest);            

        ReferenceClass obj1 = new ReferenceClass();
        obj1.MyProperty = "50";
        Method2(obj1);
        Console.WriteLine("Value of property: {0}", obj1.MyProperty);

        Console.ReadKey();
    }

所以任何人都可以帮助我理解当我们作为参数传递时,虽然字符串是引用类型,但是在外部方法中没有更新的字符串值是什么原因。

0 个答案:

没有答案