按照檔案的解釋和示例(長代碼但很容易理解,直接從檔案中復制粘貼)我發現了以下內容:
using System;
public class IdInfo
{
public int IdNumber;
public IdInfo(int IdNumber)
{
this.IdNumber = IdNumber;
}
}
public class Person
{
public int Age;
public string Name;
public IdInfo IdInfo;
public Person ShallowCopy()
{
return (Person) this.MemberwiseClone();
}
public Person DeepCopy()
{
Person other = (Person) this.MemberwiseClone();
other.IdInfo = new IdInfo(IdInfo.IdNumber);
other.Name = String.Copy(Name);
return other;
}
}
public class Example
{
public static void Main()
{
// Create an instance of Person and assign values to its fields.
Person p1 = new Person();
p1.Age = 42;
p1.Name = "Sam";
p1.IdInfo = new IdInfo(6565);
// Perform a shallow copy of p1 and assign it to p2.
Person p2 = p1.ShallowCopy();
// Display values of p1, p2
Console.WriteLine("Original values of p1 and p2:");
Console.WriteLine(" p1 instance values: ");
DisplayValues(p1);
Console.WriteLine(" p2 instance values:");
DisplayValues(p2);
// Change the value of p1 properties and display the values of p1 and p2.
p1.Age = 32;
p1.Name = "Frank";
p1.IdInfo.IdNumber = 7878;
Console.WriteLine("\nValues of p1 and p2 after changes to p1:");
Console.WriteLine(" p1 instance values: ");
DisplayValues(p1);
Console.WriteLine(" p2 instance values:");
DisplayValues(p2);
// Make a deep copy of p1 and assign it to p3.
Person p3 = p1.DeepCopy();
// Change the members of the p1 class to new values to show the deep copy.
p1.Name = "George";
p1.Age = 39;
p1.IdInfo.IdNumber = 8641;
Console.WriteLine("\nValues of p1 and p3 after changes to p1:");
Console.WriteLine(" p1 instance values: ");
DisplayValues(p1);
Console.WriteLine(" p3 instance values:");
DisplayValues(p3);
}
public static void DisplayValues(Person p)
{
Console.WriteLine(" Name: {0:s}, Age: {1:d}", p.Name, p.Age);
Console.WriteLine(" Value: {0:d}", p.IdInfo.IdNumber);
}
}
在第二個輸出中,我希望根據檔案p2.Name是 Frank 作為string參考型別,因此應該受到原始物件中名稱更改的影響。
// The example displays the following output:
// Original values of p1 and p2:
// p1 instance values:
// Name: Sam, Age: 42
// Value: 6565
// p2 instance values:
// Name: Sam, Age: 42
// Value: 6565
//
// Values of p1 and p2 after changes to p1:
// p1 instance values:
// Name: Frank, Age: 32
// Value: 7878
// p2 instance values:
// Name: Sam, Age: 42 ---> EXPECTED FRANK HERE
// Value: 7878
//
// Values of p1 and p3 after changes to p1:
// p1 instance values:
// Name: George, Age: 39
// Value: 8641
// p3 instance values:
// Name: Frank, Age: 32
// Value: 7878
實際上這兩個欄位都在 DeepCopy 方法中處理:
other.IdInfo = new IdInfo(IdInfo.IdNumber);
other.Name = String.Copy(Name);
如果兩者都是參考型別,為什么會IdInfo.Value受到原始物件更改的影響,而Name不會受到影響?
uj5u.com熱心網友回復:
這里沒有什么取決于字串是參考還是值型別。您創建的克隆Person-在這一點上,雙方p1并p2有.Name在同一指向string的物件。然后您更改.Nameon p1。重要的是: *這根本不會影響 string - 它只是更改p1為指向一個完全不同的 string。這就是這里發生的一切。
由于字串表面上是不可變的,因此您幾乎總是將值更改為指向完全不同的字串;您(幾乎)從未真正更改存在的字串,因此:除了了解記憶體使用情況外,它是參考型別還是值型別很少相關。
出于同樣的原因:確實沒有必要呼叫string.Copy,并且string.Copy 可以直接實作return value;(雖然不是 - 我檢查過)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/337000.html
上一篇:過濾僅包含R中某些字母的字串
