2013-09-26 20 views
2

我只是好奇,如果這樣的事情可能在C#中。我不知道爲什麼會有人想這樣做,但它仍然是有趣的,如果是可以做的:c#是否有可能獲取對象的引用,獲取對象本身並對其進行更改,而不是分配給新對象?

public class Test 
{ 
    public string TestString { private set; get; } 
    public Test(string val) { TestString = val; } 
} 

    public class IsItPossible 
    { 
     public void IsItPossible() 
     { 
      Test a = new Test("original"); 
      var b = a; 
      //instead of assigning be to new object, I want to get where b is pointing and change the original object 
      b = new Test("Changed"); // this will assign "b" to a new object", "a" will stay the same. We want to change "a" through "b" 
      //now they will point to different things 
      b.Equals(a); // will be false 
      //what I'm curious about is getting where b is pointing and changing the object itself, not making just b to point to a new object 
      //obviously, don't touch a, that's the whole point of this challenge 

      b = a; 
      //some magic function 
      ReplaceOriginalObject(b, new Test("Changed")); 
      if (a.TestString == "Changed" && a.Equals(b)) Console.WriteLine("Success"); 
     } 
    } 
+0

我不這麼認爲,但我認爲它也不重要。當您創建新對象並將變量指向新對象(堆上的新空間)時,如果沒有引用舊對象(堆中的舊空間),則垃圾收集器將很快將其清除,從而離開你在一個邏輯上等於你想要達到的狀態。 – David

+1

在線上'b = new Test(「Changed」);'你在哪裏說'「//這會將」b「分配給一個新對象」,從技術上講,你應該說「//這會給一個新對象賦予」b 「 ' –

+1

創建一個新對象的條件之一嗎?如果沒有,b = a;然後是b.TestString =」已更改「將改變對象的值,儘管你只有一個。 – Alvaro

回答

6

如果你的意思是「我可以改變的a值是指不同的對象,簡單地通過改變b的值?「那麼答案是否定的。

重要的是要明白,變量的值永遠不是一個對象 - 總是一個值類型值或引用。我喜歡考慮像紙片這樣的變量以及房屋等物體。

一張紙可以寫上一個值類型值(例如一個數字)或一個房子的地址。當你寫:

var b = a; 

這是創造的把一張白紙(b)和複製什麼是上表a寫入到片b。在這一點上你可以做兩件事:

  • 更改b上寫的內容。這並不影響a甚至切向寫的內容
  • 轉到寫在b上的地址,並修改房子(例如繪製前門)。這並不會改變a上寫的內容,但確實是,這意味着當您訪問a上的地址時,您會看到更改(因爲您要去同一棟房子)。

這是假設「常規」變量,介意你 - 如果你使用ref參數,你有效地使一個變量成爲另一個變量的別名。因此,例如:

Test a = new Test("Original"); 
ChangeMe(ref a); 
Conosole.WriteLine(a.TestString); // Changed 

... 

static void ChangeMe(ref Test b) 
{ 
    b = new Test("Changed"); // This will change the value of a! 
} 

在這裏,我們有有效的一張紙,用的名字a(調用代碼)b(在方法)。

+0

是的,a是引用,b是引用。引用指向並將其更改爲c # – CoolCodeBro

+2

@CoolCodeBro:不,'a'是一個變量,'b'是一個變量。他們的*值*是參考。 –

+0

好的,A有寫在房子上的地址。B複製了寫入的內容。 B和A有相同的房子地址。知道房子的地址,我們不能去房子本身並改變它。一個將有相同的地址寫,但現在房子會不同,因爲B告訴某人的地址,他們取代了房子 – CoolCodeBro