0

情况:我最近看到一篇文章,其中一位雇主要求入门级候选人解决​​一个复杂的参考问题(未显示),以及与堆栈和托管堆有关的问题。我花了一些时间来学习这些概念以供个人理解,但不知道这些被认为是“入门级”知识。作为与 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
4

3 回答 3

3

这类问题是为了测试候选人是否理解参考变量和值变量之间的区别。提供的场景(原样)几乎不会在真实世界(tm)代码中发生。但是,混淆导致理解为什么这个代码片段能做它可以做的事情并且确实会导致很多错误,尤其是当有不同的函数处理相同的数据时。

于 2012-12-07T18:38:12.830 回答
2

想象一个班级

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
}
于 2012-12-07T18:58:36.770 回答
1

我不确定你到底在问什么,开发人员可能会在多个变量中存储相同的引用有很多原因,但这完全取决于代码。请记住,该对象仍然只有一个位置存在于堆中,但可能有许多对其的引用(这就是托管垃圾收集器用于清理不再引用的对象的地方)

显然,您的示例只是糟糕的代码。这些类型的问题类似于 C++ 指针问题。C# 作为一种受管理的语言,试图远离指针,但理解值类型和引用类型之间的区别仍然很重要。这主要是这些问题的设计目的。

于 2012-12-07T18:40:16.113 回答