gpt4 book ai didi

c# - 如何在 C# 中获得更多封装?

转载 作者:太空狗 更新时间:2023-10-29 20:17:09 28 4
gpt4 key购买 nike

我最近差不多完整地学习了 C#。但是,在 C++ 中,我可以在将对象传递给方法时使用 const 修饰符实现更好的封装。但是在C#中,可以通过引用参数修改对象,比如Graphics对象上的Dispose

有时我需要更多的封装。属性可以给出更好的解决方案。但是,我发现,例如,不允许修改 Form.Location 属性,甚至不允许修改其 X 成员。虽然Form.Locationget; set; 属性,其成员不可修改。我试着用 Point {get; set;} 属性,但我仍然可以修改 X 成员。

如前所述,当一个方法例如 Dispose 是一个对象时,这也是一个问题。

如何在 C# 中实现更多封装?

最佳答案

您不能使用 Form.LocationX 属性,因为 Form.Location 是一个返回值类型<的属性/em>()。一旦您访问 Form.Location,您就会得到该位置的拷贝;因此,更改此拷贝 中的某些内容是没有意义的。由于 this.Location.X = ... 是一个明显的错误,C# 编译器会阻止您这样做。

但是,您可以替换 Form.Location 的完整值,因为它的属性 setter 是 public:

private void button1_Click(object sender, EventArgs e)
{
// move window to the left edge of the screen
this.Location = new Point(0, this.Location.Y);
}

或者,或者,

private void button1_Click(object sender, EventArgs e)
{
// move window to the left edge of the screen
var loc = this.Location;
loc.X = 0; // yes, it's a mutable struct
this.Location = loc;
}

回到你原来的问题:如果你想让一个对象可以访问,但又不想修改它,你需要自己封装它。例如,如果您希望您的类的使用者能够在您的 Graphics 对象上进行 Draw 但不希望他们调用 Dispose,只是不能直接公开 Graphics 对象。相反,您需要包装允许消费者调用的每个方法:

// bad, consumer can do anything with the Graphics object
public Graphics Graphics
{
get { return graphics; }
}

// good, consumer can only do specific stuff
public void Draw(...)
{
graphics.Draw(...);
}

关于c# - 如何在 C# 中获得更多封装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7541378/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com