加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:47:38 所属栏目:百科 来源:网络整理
导读:我最近大致了解了C#.但是,在C中,我可以在使用const修饰符将对象传递给方法时实现更好的封装.但是在C#中,可以通过引用参数修改对象,例如Dispose on Graphics对象. 我有时需要更多的封装.属性可以提供更好的解决方案.但是,我发现,例如,不允许修改Form.Location
我最近大致了解了C#.但是,在C中,我可以在使用const修饰符将对象传递给方法时实现更好的封装.但是在C#中,可以通过引用参数修改对象,例如Dispose on Graphics对象.

我有时需要更多的封装.属性可以提供更好的解决方案.但是,我发现,例如,不允许修改Form.Location属性甚至修改其X成员.虽然Form.Location得到了;组;属性,其成员不能修改.我尝试用Point {get; set;}属性但我仍然可以修改X成员.

当一个方法例如处理一个对象时,这也是一个问题,正如提到的那样.

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

解决方法

您不能使用Form.Location的X属性,因为Form.Location是一个返回值类型(Point)的属性.只要您访问Form.Location,就会获得该位置的副本;因此,改变这个副本中的某些东西是没有意义的.由于this.Location.X = …是一个明显的错误,C#编译器阻止你这样做.

但是,您可以替换Form.Location的完整值,因为它的属性设置器是公共的:

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对象上绘制但不希望它们调用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(...);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读