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

これらの種類の質問は、候補者が参照変数と値変数の違いを理解しているかどうかをテストするためにあります。提供されたシナリオ (現状のまま) は、Real World (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

あなたが何を求めているのか正確にはわかりません。開発者が同じ参照を複数の変数に保存する理由はたくさんありますが、それはすべてコードに依存します。オブジェクトが存在するヒープ内の場所はまだ 1 つしかありませんが、それへの参照が多数ある可能性があることに注意してください (参照されなくなったオブジェクトをクリーンアップするためにマネージド ガベージ コレクターが登場する場所です)。

明らかに、あなたの例は単に悪いコードです。これらのタイプの質問は、C++ ポインターの質問に似ています。マネージ言語としての C# はポインターから離れようとしていますが、値型と参照型の違いを理解することは依然として重要です。これは、主にこれらの質問が設計されているものです。

于 2012-12-07T18:40:16.113 に答える