none
在C#之中,2個相同型別的變數如何共用同一個記憶體位址? RRS feed

  • 問題

  • 請問在C#之中,2個相同型別的變數如何共用同一個記憶體位址?

    我想做到下面的效果

                unsafe
                {
                    int s1 = 500;
                    System.Console.WriteLine(s1);

                    int* hs = &s1;
                    System.Console.WriteLine(*hs);

                    *hs = 25;
                    System.Console.WriteLine(s1);
                }

    但C#好像不能用基本型別外的指標,如string物件,要怎麼做呢?

    2006年6月7日 上午 09:45

解答

  • 基本上,上面的寫法和在 C/C++ 中的涵義不太一樣,如果是C/C++,s1 和 s2 參照到同一塊記憶體位置,所以,無論 s1 或 s2 進行修改時,另一個的資料會同步改變,這是可以理解。

    不過如果在 C# 中,s1 和 s2 是參照到同一個 string object,而 string object 的內容資料是不允許被修改,所以 s2 = "BBB" 會產生另一個 "BBB" string object,並且 s2 會重新參照到 "BBB" 這個新的 string object,和 s1 參照到不同的 object。所以針對上面哪各問題的解法我想到一個,因為 string object 不允許被修改,所以會產生一個新的 object,那就使用一個允許被修改的 string object,如此 s1 和 s2 的參照就不會被改變
    ,那就是用 StringBuilder  .... 如下

                StringBuilder s1 = new StringBuilder();
                s1.Append("AAA");
                StringBuilder s2 = s1;
                s2.Length = 0;
                s2.Append("BBB");
                Console.WriteLine(s1.ToString());  // "BBB"
    2006年6月16日 上午 02:17

所有回覆

  • .NET 並不鼓勵你直接使用記憶體指標, 上述的範例似乎不具任何意義, 你不妨說明你想達到什麼目的, .NET 應有適當的方式可以達成。
    2006年6月7日 下午 02:36
  • 不用指標,用物件的參考也可以

    我想要把物件的參考註冊到一個泛型的陣列物件之中,如下

    Defin:

    Pair<T>()

    Pair<T1,T2>()

    宣告方式如下:

    Pair< Pair<int>, string>[]  XXX ;

                                    |------------------>   將物件的參考放在這裡???

    可是我沒有辦法將string 這個地方放物件的參考???  ^_^|||

    在加入參考後用foreach取回string物件的參考進行賦值。

    麻煩大大指點

    2006年6月8日 上午 12:51
  • 抱歉~~ 我再補上一段

                string s1 = "AAA";
                string s2 = s1;
                s2 = "BBB";
                System.Console.WriteLine("{0}", s1);

    我想要讓 s1的變數藉由s2來賦值成BBB

    2006年6月8日 上午 01:00
  • 基本上,上面的寫法和在 C/C++ 中的涵義不太一樣,如果是C/C++,s1 和 s2 參照到同一塊記憶體位置,所以,無論 s1 或 s2 進行修改時,另一個的資料會同步改變,這是可以理解。

    不過如果在 C# 中,s1 和 s2 是參照到同一個 string object,而 string object 的內容資料是不允許被修改,所以 s2 = "BBB" 會產生另一個 "BBB" string object,並且 s2 會重新參照到 "BBB" 這個新的 string object,和 s1 參照到不同的 object。所以針對上面哪各問題的解法我想到一個,因為 string object 不允許被修改,所以會產生一個新的 object,那就使用一個允許被修改的 string object,如此 s1 和 s2 的參照就不會被改變
    ,那就是用 StringBuilder  .... 如下

                StringBuilder s1 = new StringBuilder();
                s1.Append("AAA");
                StringBuilder s2 = s1;
                s2.Length = 0;
                s2.Append("BBB");
                Console.WriteLine(s1.ToString());  // "BBB"
    2006年6月16日 上午 02:17