2010-12-18 9 views
0
StringBuilder first = new StringBuilder(); 
StringBuilder second = first; 

String str = "Love"; 

変数 "str"が型の値であるのに対して、変数 "second"が型参照であるかどうかをチェックする方法はありますか?私はまだそれを得ることができない周りのグーグルでは、非常に新しいC#でここで。私はsecond.getType()があることを知っていますが、それはタイプリファレンスの2番目の場合私に知らせていません。変数がC#の型参照型であるかどうかを調べるにはどうすればよいですか?

ありがとうございます。私が封入されるか、または制限されたクラス:-)ではないだから

追加情報ここで

私はCシャープのプログラミングテストに直面しています、ここで率直になりたいが、もちろんそれは、開いた本のテストです。私はPHP、C/C++、Perlにもっと精通していますが、Cシャープでは非常に新しいですが、私はそれについて学ぶのが大好きです。ここに彼らのテストがあります。私はすでにいくつかの機能を記入していますが、2つまたは3つは除外されています。それらはrefおよびunrefです。下のコードが表示されたら、PrintSortedData関数のReference typeを<の間に出力する必要があります。テストの質問はコードのコメントにあります。たぶん私はまだプログラミングロジックを手に入れていないかもしれません。

/// The DataObject class stored with a key 
class DataObject 
{ 
    public string key = ""; 
    public int value = 0; 
    // Populate 
    public DataObject(string k, int v = 0) 
    { 
     key = k; 
     value = v; 
    } 

} 

class Program 
{ 
    static Hashtable Data = new Hashtable(); 
    static string[] StaticData = new string[] { "X-Ray","Echo","Alpha", "Yankee","Bravo", "Charlie", 
     "Delta", "Hotel", "India", "Juliet", "Foxtrot","Sierra", 
     "Mike","Kilo", "Lima", "November", "Oscar", "Papa", "Qubec", 
     "Romeo", "Tango","Golf", "Uniform", "Victor", "Whisky", 
     "Zulu"}; 

    static void Main(string[] args) 
    { 
     for (int i = 0; i < StaticData.Length; i++) 
      Data.Add(StaticData[i].ToLower(), new DataObject(StaticData[i])); 
     while (true) 
     { 
      PrintSortedData(); 
      Console.WriteLine(); 
      Console.Write("> "); 
      string str = Console.ReadLine(); 
      string[] strs = str.Split(' '); 

      if (strs[0] == "q") 
       break; 
      else if (strs[0] == "print") 
       PrintSortedData(); 
      else if (strs[0] == "swap") 
       Swap(strs[1], strs[2]); 
      else if (strs[0] == "ref") 
       Ref(strs[1], strs[2]); 
      else 
       Console.WriteLine("Invalid Input"); 
     } 
    } 

    /// <summary> 
    /// Create a reference from one data object to another. 
    /// </summary> 
    /// <param name="key1">The object to create the reference on</param> 
    /// <param name="key2">The reference object</param> 
    static void Ref(string key1, string key2) 
    { 

    } 

    /// <summary> 
    /// Removes an object reference on the object specified. 
    /// </summary> 
    /// <param name="key">The object to remove the reference from</param> 
    static void UnRef(string key) 
    { 
     // Populate 
    } 



    /// <summary> 
    /// Prints the information in the Data hashtable to the console. 
    /// Output should be sorted by key 
    /// References should be printed between '<' and '>' 
    /// The output should look like the following : 
    /// 
    /// 
    /// Alpha...... -3 
    /// Bravo...... 2 
    /// Charlie.... <Zulu> 
    /// Delta...... 1 
    /// Echo....... <Alpha> 
    /// --etc--- 
    /// 
    /// </summary> 
    static void PrintSortedData() 
    { 
     // Populate 
     ArrayList keys = new ArrayList(Data.Keys); 
     keys.Sort(); 

     foreach (object obj in keys) 
     { 
      Console.Write(obj + "......." + ((DataObject)Data[obj]).value + "\n"); 
     } 
    } 
} 
+0

'first'、' second'、および 'str'はすべての参照です。この場合、 'first'と' second'は両方とも同じオブジェクトを参照します。 – Gabe

答えて

1

firstsecondStringBuilder両方の参照です。それらは同じオブジェクトへの参照となることがあります。言い換えれば、彼らは同じオブジェクトIDを持っています。 strは、タイプStringの参照です。

+0

ありがとうCody Grayさんが私の質問をさらに明確にしました。「あなたの暗黙の質問では、直接インスタンス化したオブジェクトを保持する変数と暗黙的に保持する変数の違いをそのオブジェクトへの参照、まあ、できません。 " – William

+0

@ウィリアム、彼は正しいです。あなたはそれをすることはできません。同じオブジェクト識別情報を持つ2つの参照は区別できません。 –

+0

ありがとうございます。上記の質問に追加した追加情報を見て、なぜそれが必要なのかを知ってください。ありがとう – William

2

両方の変数は参照型です。オブジェクトStringBuilderのインスタンスは、依然として参照型であり、オブジェクト型はstringです。 C#で

値型は、いずれかのユーザ定義、structs列挙型、数値型(例えば、intfloatdoubledecimalなど)詳細については、Value Typesの文書を参照しています。

リファレンスタイプは、クラス、インターフェイス、デリゲート、さらにはstringobjectなどの組み込みタイプを含むすべてのものです。驚くほど多くの詳細については、Reference Typesのドキュメントを参照してください。


あなたの暗黙の質問では、直接インスタンス化したオブジェクトを保持する変数と、そのオブジェクトへの暗黙の参照を保持する変数の違いをどのように判断できますか? 。 C#では、これらは同じことです。どちらの変数もそのオブジェクトを保持するのではなく、そのオブジェクトへのポインタ(つまり、そのオブジェクトの場所への間接参照)を保持します。

もちろん、2つの機能を区別する方法がないことを心配する必要はありません。これらの機能はまったく同じ機能を持つためです。どちらか一方が指すオブジェクトを変更する場合は、他方が指すオブジェクトも変更します。

+0

"あなたの暗黙の質問では、あなたが直接インスタンス化したオブジェクトを保持する変数と、そのオブジェクトへの暗黙的な参照を保持する変数との違いをどうやって判断できますか? - コーディ・グレイ、それは私が知りたいと思う正確なものです。それに代わる方法はありますか? – William

+0

@ウィリアム:第2段落を読んでください。この機能は省略されたものではなく、単に意味をなさないものです。変数はまったく同じです。いずれかが指すオブジェクトを変更すると、*両方が指すオブジェクトが変更されます。コンパイラ/実行時は、最初に作成したオブジェクトを保持するものは気にしません。それが関係している限り、違いはありません。オブジェクトがその住所のようにメモリ内の同じ場所を占めているとします。私が同じ住所の2人の人に与えると、彼らはどちらも私の家で終わるだろう。それはここでも同じようなものです。 –

+0

ありがとうコーディグレー。私が考えているのは、値変数は家の土地のようなものです。実際には家を物理的に保持していますが、参照変数は家の住所にLOGICAL住所を持つ紙のようです。彼らはどちらももちろん同じ場所にあります。土地は物理的ですが、住所は論理的ですが、住所だけが本当にその土地に行く方法を指摘するのに役立ちます。だから私は紙の住所や土地を持っているかどうかを知ろうとしていますか?なぜ私がそれを必要としているか知るために、上記の質問に追加した追加情報を参照してください。ありがとうございます – William

0

私はここでフランクになりたい、私はCシャープのプログラミングテストに直面している。私はPHP、C/C++、Perlにもっと精通していますが、Cシャープでは非常に新しいですが、私はそれについて学ぶのが大好きです。ここに彼らのテストがあります。私はすでにいくつかの関数を記入していますが、2つまたは3つだけ残しておきます。

/// The DataObject class stored with a key 
class DataObject 
{ 
    public string key = ""; 
    public int value = 0; 
    // Populate 
    public DataObject(string k, int v = 0) 
    { 
     key = k; 
     value = v; 
    } 

} 

class Program 
{ 
    static Hashtable Data = new Hashtable(); 
    static string[] StaticData = new string[] { "X-Ray","Echo","Alpha", "Yankee","Bravo", "Charlie", 
     "Delta", "Hotel", "India", "Juliet", "Foxtrot","Sierra", 
     "Mike","Kilo", "Lima", "November", "Oscar", "Papa", "Qubec", 
     "Romeo", "Tango","Golf", "Uniform", "Victor", "Whisky", 
     "Zulu"}; 

    static void Main(string[] args) 
    { 
     for (int i = 0; i < StaticData.Length; i++) 
      Data.Add(StaticData[i].ToLower(), new DataObject(StaticData[i])); 
     while (true) 
     { 
      PrintSortedData(); 
      Console.WriteLine(); 
      Console.Write("> "); 
      string str = Console.ReadLine(); 
      string[] strs = str.Split(' '); 

      if (strs[0] == "q") 
       break; 
      else if (strs[0] == "print") 
       PrintSortedData(); 
      else if (strs[0] == "swap") 
       Swap(strs[1], strs[2]); 
      else if (strs[0] == "ref") 
       Ref(strs[1], strs[2]); 
      else 
       Console.WriteLine("Invalid Input"); 
     } 
    } 

    /// <summary> 
    /// Create a reference from one data object to another. 
    /// </summary> 
    /// <param name="key1">The object to create the reference on</param> 
    /// <param name="key2">The reference object</param> 
    static void Ref(string key1, string key2) 
    { 

    } 

    /// <summary> 
    /// Removes an object reference on the object specified. 
    /// </summary> 
    /// <param name="key">The object to remove the reference from</param> 
    static void UnRef(string key) 
    { 
     // Populate 
    } 



    /// <summary> 
    /// Prints the information in the Data hashtable to the console. 
    /// Output should be sorted by key 
    /// References should be printed between '<' and '>' 
    /// The output should look like the following : 
    /// 
    /// 
    /// Alpha...... -3 
    /// Bravo...... 2 
    /// Charlie.... <Zulu> 
    /// Delta...... 1 
    /// Echo....... <Alpha> 
    /// --etc--- 
    /// 
    /// </summary> 
    static void PrintSortedData() 
    { 
     // Populate 
     ArrayList keys = new ArrayList(Data.Keys); 
     keys.Sort(); 

     foreach (object obj in keys) 
     { 
      Console.Write(obj + "......." + ((DataObject)Data[obj]).value + "\n"); 
     } 
    } 
} 
+1

これが元の質問とどのように正確に関係しているかわかりません。別のことを尋ねたい場合は、新しい質問を作成してください。元の投稿に何かを追加したい場合は、「編集」ボタンを使用してください。ただし、ここでは答えとして投稿しないでください。そして、私はあなたの 'Ref'関数で何をしようとしているのか分かりませんが、おそらくこれはうまくいかないようです。 –

+0

ありがとうございました。Doc Brownさん、私の知らないことを申し訳なく思っています。追加した後、私はそれを追加する代わりに編集することに気付きました。私は編集の代わりに追加する理由は、他のフォーラムでは、私は返事を追加するのではなく編集しようとしていたので、 "あなたは編集の代わりに返事をしなければならないように、会話の線形的かつ論理的な流れを見てください。しかし、ここでは逆です。しかし、私はここにスタイルを適応させます。また、私はこのフォーラムで非常に新しいです。ありがとう。 – William

+0

Ops、btw、それはまだ私の元の質問に関連しており、新しい問題ではありません。変数が実際のObjectを保持しているのか、単なる参照であるのかを判断する必要がある理由を説明しようとしているからです。 – William

関連する問題