C#为什么要创建对单个对象的多个引用?

时间:2012-12-07 18:33:39

标签: c# reference

情况:我最近发现一篇文章,其中雇主要求入门级候选人解决​​复杂的参考问题(未显示),以及有关堆栈和托管堆的问题。我花了一些时间来学习这些概念以便个人理解,但却没有意识到这些被认为是“入门级”的。知识。作为一个与CS相关的CIS专业(我知道的巨大差异),这些概念并没有被教授。

问题为什么开发人员会将对象引用分配给另一个引用?更简洁的是,为什么开发人员会在面试场景中描述几十个引用?这只是测试主题理解的问题,还是这个参考翻转'每天使用的练习"发展?

using System;

namespace QuickConsoleTesting
{
   class Program
   {
      static void Main()
     {
         //Instantiate two new Person objects on the heap
         Person person1 = new Person() { Name = "Jim" };
         Person person2 = new Person() { Name = "Todd" };
         Person person3 = person1;
         Person person4 = new Person() { Name = "Julie" };

         //Flip-flop reference variables
         person4 = person2;
         person1 = person3;

         //Display results
         Console.WriteLine(person1.Name);
         Console.WriteLine(person2.Name);
         Console.WriteLine(person3.Name);
         Console.WriteLine(person4.Name);

        /* ======================================
         * Results displayed: Jim, Todd, Jim, Todd
         * ===================================== */

        //Hold console window
        Console.Read();

      }//END OF MAIN
    }//END OF PROGRAM

    class Person
    {
       private string name = "";

       public string Name
       {
          get { return name; }
          set { name = value; }
       }
    }//END OF PERSON

 }//END OF NAMESPACE

3 个答案:

答案 0 :(得分:3)

这些问题可用于测试候选人是否理解参考变量和值变量之间的差异。提供的场景(按原样)几乎不会发生在Real World(tm)代码中。但是,混淆导致理解为什么这个代码片段能够完成它所做的事情并且确实会导致很多错误,特别是当有各种函数处理同一数据时。

答案 1 :(得分:1)

我不确定你究竟在问什么,开发人员可能会在多个变量中存储相同的引用有很多原因,但这一切都取决于代码。请记住,对象仍然只存在于堆中的一个位置,但可能有很多对它的引用(以及托管垃圾收集器进来清理不再引用的对象的那些)

显然你的例子只是糟糕的代码。这些类型的问题类似于C ++指针问题。 C#作为一种manged语言试图远离指针,但理解值类型和引用类型之间的差异仍然很重要。这主要是针对这些问题设计的。

答案 2 :(得分:1)

想象一个班级

class Person
{
pubic string Name;
}

使用默认值传递

Person p=new Person();
//p contains the address of the newly allocated person
change(p);
//p is passed by value so the address within p would get copied into p1 which is a method parameter of change method

public void change(Person p1)
//p1 and p are separate variables containing address of person object
{
    p1.Name="SO";
    //changes name of p1 and p
    p1=null;
    //this makes p1 null not p since p and p1 are separate copies pointing to person object
}

参考

change(ref p);
//p is now passed by reference so p1 is p
public void change(ref Person p1)//p1 and p are same
{
    p1.Name="SO";
    p1=null;//this makes p and p1 null
}