关于C#中方法参数传递的问题

时间:2022-08-29 20:23:27
在C#高级编程(第七版)写到方法中的参数默认是按照值类型传递的
引用
在 C# 中 ,除 非特别说明 ,所 有的参数都通过值来传递。 但是 ,在 理解引用类型的含义时需要注
意。因为引用类型的变量只包含对象的引用 ,将 要复制的正是这个引用 ,而 不是对象本身 ,所 以对
底层对象的修改会保留下来。相反 ,值 类型的对象包含的是实际数据 ,所 以传递给方法的是数据本
身的副本。例如 ,int 通过值传递给方法 ,对 应方法对该 int 的值所做的任何改变都没有改变原 血
对象的值。但如果把数组或其他引用类型(如类)传递给方法 ,对应的方法就会使用该引用改变这个
数组中的值。

c#(.net)框架中预定义15个类型其中13个是值类型,另外两个(string && object)是引用类型。
按照上述的结果是如果把string 和 object传递给方法在方法类改变这一值其外部的值会被改变。
测试代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    /// <summary>
    /// 论证方法的参数是否以引用传递。参数以值类型传递
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            string Test = "I Love You!";
            Program TestString = new Program();
            TestString.ChangeString(Test);
            Console.WriteLine(Test);//I Love You!
            int[] ints = { 0, 1, 2, 3 };
            TestString.ChangeArray(ints);
            Console.WriteLine(ints[0].ToString());
            Console.ReadKey();


        }
        public void ChangeString(string str)
        {
            str = "I heart you";
        }
        public void ChangeArray(int[] ints)
        {
            ints[0] = 100;
        }
    }
}

在我测试后string的值并没有改变而数组的值改变了。这是为什么。数组和string不一样是引用类型吗?

12 个解决方案

#1


楼主试试下面写法

public void ChangeString(ref string str)
        {
            str = "I heart you";
        }
调用时:
TestString.ChangeString(ref Test);

#2


你看看你写的那个语句,你那个test=i love you 那你下面传的值也是str=i love you str=i heart you
这个值就改变的了,但是这只是个参数传过来的,你外面那个实参你确没有改变的,改变的只是形参,如果你在上面直接test=i heart you 那这个肯定是输出是i heart you !

#3


string是引用类型,但比较特殊,难道你看书没有看到?

#4


引用 2 楼 u011130289 的回复:
你看看你写的那个语句,你那个test=i love you 那你下面传的值也是str=i love you str=i heart you
这个值就改变的了,但是这只是个参数传过来的,你外面那个实参你确没有改变的,改变的只是形参,如果你在上面直接test=i heart you 那这个肯定是输出是i heart you !

数组也是形参不是改变了么。

#5


引用 1 楼 tgcx111 的回复:
楼主试试下面写法

public void ChangeString(ref string str)
        {
            str = "I heart you";
        }
调用时:
TestString.ChangeString(ref Test);

这个我知道。

#6


引用 3 楼 MicrosoftCenterOfHN 的回复:
string是引用类型,但比较特殊,难道你看书没有看到?

我知道,但是不知道哪里特殊

#7


你只要这样记住就可以了,string是特殊的引用类型,所以他是例外的,不会被改变

#8


值传递和引用传递

你可以把string的传递 特殊当成值传递

#9



       public void ChangeArray(int[] ints)
        {
            ints = new int[]{100,1,2,3};
        }


你试一下这个。。。。

#10


str = "I heart you";
相当于: str = new string("I heart you");

#11


string 是一个特殊的类型在于,string 一旦创建,不能再修改里面的值,要改变,只能从新创建。
例如 string str="abc";
你无法执行: str[1]='z';
但你可以: char c1=str[1];

#12


引用 11 楼 angel6709 的回复:
string 是一个特殊的类型在于,string 一旦创建,不能再修改里面的值,要改变,只能从新创建。
例如 string str="abc";
你无法执行: str[1]='z';
但你可以: char c1=str[1];

懂了,谢谢

#1


楼主试试下面写法

public void ChangeString(ref string str)
        {
            str = "I heart you";
        }
调用时:
TestString.ChangeString(ref Test);

#2


你看看你写的那个语句,你那个test=i love you 那你下面传的值也是str=i love you str=i heart you
这个值就改变的了,但是这只是个参数传过来的,你外面那个实参你确没有改变的,改变的只是形参,如果你在上面直接test=i heart you 那这个肯定是输出是i heart you !

#3


string是引用类型,但比较特殊,难道你看书没有看到?

#4


引用 2 楼 u011130289 的回复:
你看看你写的那个语句,你那个test=i love you 那你下面传的值也是str=i love you str=i heart you
这个值就改变的了,但是这只是个参数传过来的,你外面那个实参你确没有改变的,改变的只是形参,如果你在上面直接test=i heart you 那这个肯定是输出是i heart you !

数组也是形参不是改变了么。

#5


引用 1 楼 tgcx111 的回复:
楼主试试下面写法

public void ChangeString(ref string str)
        {
            str = "I heart you";
        }
调用时:
TestString.ChangeString(ref Test);

这个我知道。

#6


引用 3 楼 MicrosoftCenterOfHN 的回复:
string是引用类型,但比较特殊,难道你看书没有看到?

我知道,但是不知道哪里特殊

#7


你只要这样记住就可以了,string是特殊的引用类型,所以他是例外的,不会被改变

#8


值传递和引用传递

你可以把string的传递 特殊当成值传递

#9



       public void ChangeArray(int[] ints)
        {
            ints = new int[]{100,1,2,3};
        }


你试一下这个。。。。

#10


str = "I heart you";
相当于: str = new string("I heart you");

#11


string 是一个特殊的类型在于,string 一旦创建,不能再修改里面的值,要改变,只能从新创建。
例如 string str="abc";
你无法执行: str[1]='z';
但你可以: char c1=str[1];

#12


引用 11 楼 angel6709 的回复:
string 是一个特殊的类型在于,string 一旦创建,不能再修改里面的值,要改变,只能从新创建。
例如 string str="abc";
你无法执行: str[1]='z';
但你可以: char c1=str[1];

懂了,谢谢