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

String str = "Love"; 

有沒有辦法檢查變量「second」是否是類型引用,而變量「str」是Type Value?我一直在谷歌搜索仍然無法得到它,在C#這裏很新。我知道有second.getType(),但是如果第二個是Type Reference,我不知道。如何確定變量是否是C#中的類型引用?

非常感謝。

其他信息

在這裏,我想坦率地說在這裏,我面對的升C編程測試,當然它是一個開放的書測試,因爲我在一個封閉或限制類:-)我不是。我更熟悉PHP,C/C++,Perl,但在C語言中很新,但我喜歡瞭解它。這是他們的測試。我已經填寫了一些功能,只留下了2或3,那些是ref和unref。如果您看到下面的代碼,我需要在PrintSortedData函數中輸出<>之間的引用類型。測試問題在代碼的評論。也許我還沒有正確的編程邏輯。

/// 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','秒'和'str'是*所有*引用。在這種情況下,'first'和'second'都指向同一個對象。 – Gabe 2010-12-18 07:36:15

回答

1

firstsecondStringBuilder類型的兩個引用。它們碰巧是對同一個對象的引用;換句話說,它們具有相同的對象標識。 str是類型String的參考。

+0

非常感謝科迪格雷已經進一步澄清了我的問題,科迪格雷:「就你的隱含問題而言,你如何確定持有你直接實例化的對象的變量和持有隱式變量的變量之間的差異參考那個對象,好吧,你不能。「 – William 2010-12-18 07:48:10

+0

@威廉,他是對的。你不能那樣做。具有相同對象標識的兩個引用是無法區分的。 – 2010-12-18 07:49:50

+0

謝謝。請查看我在上面的問題中添加的其他信息,以瞭解爲什麼我需要這些信息。謝謝 – William 2010-12-18 08:02:55

2

這兩個變量都是引用類型。對象StringBuilder的一個實例仍然是引用類型,因爲是string類型的對象。在C#

值類型或者是用戶定義structs,枚舉和數值類型(如intfloatdoubledecimal等)參見Value Types的文檔的詳細信息。

引用類型是其他所有內容,包括類,接口,委託,甚至一些內置類型,如stringobject。有關令人驚訝的更多細節,請參見Reference Types上的文檔。至於你的隱含問題,你如何確定一個變量,持有你直接實例化的對象和一個變量,持有隱式引用該對象,你不能。在C#中,這些都是一樣的。這兩個變量都不包含該對象,而是指向該對象的指針(即對該對象位置的間接引用)。

當然,不要擔心沒有辦法區分二者,因爲它們具有完全相同的功能。如果修改任何一個指向的對象,還可以修改另一個指向的對象。

+0

「就你的隱含問題而言,你如何確定一個擁有你直接實例化對象的變量和一個隱含引用該對象的變量之間的區別,你不能。」 - 科迪格雷,這正是我想知道的。那麼是否有另一種方法呢? – William 2010-12-18 07:46:30

+0

@William:閱讀第二段。功能不是遺漏,它根本沒有意義。變量完全相同。如果修改任何一個對象指向的對象,則修改* *指向的對象*。編譯器/運行時不關心哪一個存儲您最初創建的對象;就它而言,沒有區別。想象一下,對象在內存中佔據相同的位置,就像他們的街道地址一樣。如果我給兩個地址相同的人,他們都會在我家裏結束。這裏就是這種事情。 – 2010-12-18 07:50:51

+0

謝謝科迪格雷。我在想的是一個價值變量就像一個房子的土地,它實際上是保持住房子,而參考變量就像是一張紙,其邏輯地址指向房子的地址。當然,他們都在同一地點,土地是物質的,但地址是合乎邏輯的,但只有地址才能真正幫助我們指出如何去那個土地。所以我想知道我是否持有紙質地址或土地?查看我在上面的問題中添加的其他信息,知道爲什麼我需要這些信息。謝謝 – William 2010-12-18 08:01:00

0

在這裏我想坦率地說,我正面臨C Sharp的編程測試。我更熟悉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'函數,但看起來這可能不起作用。 – 2010-12-18 08:03:49

+0

謝謝布朗博士,對於我的無知感到抱歉,在我添加完之後,我意識到我想編輯它而不是添加它。我之所以添加而不是編輯是因爲在其他論壇上,我試圖編輯而不是添加回復,我被一個回覆者罵了一句,比如說:「你必須回覆INSTEAD編輯,這樣人們才能看到對話的線性與邏輯流程「但這裏卻恰恰相反。但我會在這裏調整風格。此外,我在這個論壇非常新。謝謝。 – William 2010-12-18 08:10:41

+0

順便說一句,順便說一句,這仍然與我原來的問題有關,這不是一個新問題。因爲我試圖解釋爲什麼我需要確定一個變量是持有一個真實的對象還是僅僅是一個引用。 – William 2010-12-18 08:22:16

相關問題