C#继承的对象问题?
1、
Brush是基类。SolidBrush是继承于Brush的子类。
同样继承于Brush的笔刷子类还有:TextureBrush、LinearGradientBrush 等等。
由于有这么多种子类的存在,如果按照传统的方法,则Graphic里每个方法都要写很多个形式。
比如:
Graphic.FillRectangle(SolidBrush brush,Rectangle rect);
Graphic.FillRectangle(TextureBrush brush,Rectangle rect);
Graphic.FillRectangle(LinearGradientBrush brush,Rectangle rect);
....
这样一来,函数的形式太多了,学习使用和维护都会增加难度。所以,为了方便使用
就可以把他们全部归结成一个,只需要把参数定义成他们的基类,则不管何种Brush都可以传递进来。
Graphic.FillRectangle(Brush brush,Rectangle rect);
以上的函数,不管是怎样的Brush子类传递进来都可以正常功能。
是不是方便很多呢?
2、
在.net里,大部分托管的代码里的类对象(非结构体的对象)。都有dispose()方法。
比如一个窗体Form,或者是一个数据集合DataTable,都会发现有dispose()方法。
因为他们都实现了IDisposable接口。
简单的说,实现这个接口,就是要告诉.net这个对象要如何销毁,当.net回收垃圾的时候,会自动调用这个函数。
如果认为.net自动调用的时机不符合自己的要求,也可以自己主动调用这个函数。
只不过调用了之后,.net的垃圾管理机制也不会第一时间销毁掉这个对象,而只是做了一个需要回收的记号。可以在下面写上 GC.Collect()来强行回收。
明白了吗?
还有就是FontStyle.Bold&FontStyle.Regular和FontStyle.Bold | FontStyle.Regular之间的区别是什么啊?
你好。
在FontStyle中一共有以下几种样式,他们的值分别是:
(普通)Regular = 0
(加粗)Bold = 1
(斜体)Italic = 2
(下划线)Underline = 4
(删除线)Strikeout = 8
则,转换成二进制来表示的话就是:
Regular 0000
Bold 0001
Italic 0010
Underline 0100
Strikeout 1000
而 & 和 | 是位运算的运算符,分别是 与运算 和 或运算。
1、与运算:相同位的两个数字都为1,则结果为1;若有一个不为1,则结果为0。
2、或运算:相同位只要一个为1,结果即为1。
所以。
FontStyle.Bold & FontStyle.Regular 的实质其实是把0000和0001的每一位二进制位,单独进行与运算,所以最后的结果仍为0000。
也就是说 FontStyle.Bold & FontStyle.Regular = FontStyle.Regular
0000
与 0001
--------------
0000
所以,FontStyle.Bold & FontStyle.Regular 最后赋值到Font里仍然是普通字体,不会加黑。字体样式没有变化。
--------------------------------------------------------------------------------------------------------------
而FontStyle.Bold | FontStyle.Regular 却不一样。将这两个值每一位二进制做或运算。
0000
或 0001
--------------
0001
最后的结果为0001。
也就是说 FontStyle.Bold & FontStyle.Regular = FontStyle.Bold
将Font样式设为 FontStyle.Bold | FontStyle.Regular 后。字体会出现黑体的效果。
dispose()是手动卸载资源。GC的作用是自动卸载。但是GC的判断要求是确定不需要了,但有不少情况下,GC也很难判断确定资源的需要和不需要。