Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将对象值存储到新对象中时,它们是否共享相同的值_C# - Fatal编程技术网

C# 将对象值存储到新对象中时,它们是否共享相同的值

C# 将对象值存储到新对象中时,它们是否共享相同的值,c#,C#,因此,在过去的几个月里,我一直在自学C#,并决定做一个项目,看看我能用学到的东西做些什么 所以我的问题是。这个新的Person selectedPerson是存储在新内存中的新对象,还是WhosBuying()方法中返回的Person[i]的引用。 基本上我要问的是,它们是否共享相同的属性,因此如果我更新一个,它将更新另一个,或者它们是不同的对象 //Chose the person whos buying something and save into selectedPerson Perso

因此,在过去的几个月里,我一直在自学C#,并决定做一个项目,看看我能用学到的东西做些什么

所以我的问题是。这个新的Person selectedPerson是存储在新内存中的新对象,还是WhosBuying()方法中返回的Person[i]引用。 基本上我要问的是,它们是否共享相同的属性,因此如果我更新一个,它将更新另一个,或者它们是不同的对象

//Chose the person whos buying something and save into selectedPerson
Person selectedPerson = new Person();
selectedPerson = selectedPerson.WhosBuying(person);

    public Person WhosBuying(List<Person> person)
    {
        StringBuilder buyer = new StringBuilder();
        buyer.Append("Who's Buying? ");

        //Loop through all persons: (1)person[0].Name (2)person[1].Name
        int i = 1;
        foreach (var p in person)
        {
            buyer.Append("(" + (i) + ")" + p.Name + " ");
            i++;
        }

        Console.WriteLine(buyer);
        string buying = Console.ReadLine();

        //Store the person buying into selectedPerson 
        //by returning the person selected by user input

        for (int x = 1; x < person.Count + 1; x++)
        {
            if (int.Parse(buying) == x)
                return person[x - 1];
        }
        return null;
    }
//选择购买物品的人并保存到selectedPerson中
Person selectedPerson=新人员();
selectedPerson=selectedPerson.WhosBuying(个人);
购买的公众人士(名单上的人)
{
StringBuilder买方=新的StringBuilder();
买家。追加(“谁在买?”);
//循环遍历所有人员:(1)人员[0]。姓名(2)人员[1]。姓名
int i=1;
foreach(var p亲自支付)
{
买方。追加(“+(i)+”号+p.名称+”);
i++;
}
控制台。写入线(买方);
string=Console.ReadLine();
//将购买人员存储到selectedPerson中
//通过返回用户输入选择的人员
对于(int x=1;x
首先,主过程中的“selectedPerson”是一个空白的“new person”,一个指向新对象的变量

“WhosBuying”方法完成后,变量“selectedPerson”将指向该方法返回的任何内容。它可以是null,也可以是从传递给该方法的列表中挖出的另一个人(也称为“p”)


我同意将这种方法作为实例方法不是一种好的做法;作为一个静态方法,它的功能将更有意义。它将按您现有的方式工作,但您正在无缘无故地创建和销毁一个额外的对象。

我将给您一个一般性的答案(但很长),因为这个问题可能有不同的答案

我将从定义一些东西开始(不是因为这些是正确的定义):
值:某个表达式返回或存储在变量中的值。
数据:该表达式/变量的实际数据(即字符串文本等)

Net中有两种类型的表达式/变量:值类型和引用类型

值类型:值类型的表达式/变量的值始终是数据本身。当您将其存储在变量中时,复制到该变量的是数据——当您将其作为参数发送到方法时,该数据将复制到该方法的参数

引用类型:引用类型的表达式/变量的值始终是对存储在另一个位置的数据的引用(如果您知道它是什么,则为指针)。当您将其存储在变量中时,它是复制到该变量的引用-因此它们都引用相同的数据。当您将is作为参数发送给方法时,该引用将复制到该方法的参数,以便该方法获得对相同数据的引用

现在,所有基本类型(除了
对象
字符串
和数组)、每个
枚举
、以及您定义为
结构
的每个类型都是值类型。
对象
字符串
,每个数组、委托、每个匿名类型,以及您定义为
的每个类型都是引用类型-引用类型的数据(几乎)总是使用
新建
操作符创建


而且,由于您没有将定义指定给
Person
,因此您的答案无法明确回答。但是,由于您将遇到的大多数类型都是引用类型,因此它很可能是引用类型(这意味着
whoisbuising
返回对
Person
的实际数据的引用)。

创建了一个新实例:Person selectedPerson=new Person();IMO,Person.WhosBuying应该是静态方法。然后,您将不会创建在下一行中立即释放的这个实例。同样,这个循环是不必要的——你应该解析索引一次,然后检查它是否在列表中。你为什么不自己试试看呢?