我想问一下,如果我把一个对象传递给一个类的构造函数,这个对象将是类的只读字段,并且我修改对象的属性,类中的属性也会改变,我想它是通过引用调用的。有什么方法可以更好地做到这一点/防止吗?谢谢
private void Form1_Load(object sender, EventArgs e)
{
Product p = new Product() { Name="New" };
Store s = new Store(p);
p.Name = "MODIFY!";
MessageBox.Show(s.Show());//MODIFY!
}
public class Store
{
private readonly Product product;
public Store(Product product)
{
this.product = product;
}
public string Show()
{
return this.product.Name;
}
}
public class Product
{
public string Name { get; set; }
}
发布于 2019-05-09 09:11:29
你在自己的readonly
领域存储的是一个参考。这个参考当然是只读的,永远不会改变。但仍可以更改引用对象的内容。
由于Product
似乎是一个数据保持类,我只需将内容复制到一个新实例即可:
public class Store
{
private readonly Product product;
public Store(Product product)
{
// Create a new Product instance that only this Store instance
// knows about
this.product = new Product { Name = product.Name };
}
}
现在Store.product
只要您不导出此实例,就无法从外部更改内容。
但要注意的代码里面的Store
类仍然可以改变的内容。
发布于 2019-05-09 09:31:33
如果您不想product
在Store
更改原始实例时更改内部,则必须在将其分配给字段之前进行复制:
public Store(Product product)
{
this.product = new Product() {Name = product.Name};
}
更有意思地,你可以制作Product
一个结构。传递给方法时总是复制结构,而不是通过引用传递:
public struct Product
{
public string Name { get; set; }
}
https://stackoverflow.com/questions/-100006693
复制相似问题