关于构造器和类
在初始化类的时候,分配的内存对象总是归零, 所有字段 0 or null
构造器不能被继承,也就是说 不能加virtual之类的在构造器上
如果基类没有显示构造类,那么子类就直接这样写就完了
class a {}
class b:a
{
public b() {}
}
反之
class a
{
public a(int i) {}
}
class b:a
{
public b(int j,int i):base(i) {}
}
其实就算你显示的声明构造器,编译器也会生成一个默认构造器(static,sealed,abstract除外...)
当然构造器和方法一样。 随你写多少个
class a {
int i=1;
}
其实这玩意儿在看了IL代码后, 其实他也是构造实例化的..
自身显示申明的构造器,在他之后执行
关于结构的构造器
结构的构造是比较搞的..
比如
struct aa //丫会报错 你不能直接实例化
{
int i = 0;
}
struct aa //aa 必须传参数..
{
int i;
public aa()
{
}
}
struct aa //你丫也不能这样实例化..
{
int i;
int b;
public aa(int j)
{
i = j;
}
}
想实例化 值是不可能的了,顶多这样
struct aa //什么都不传,他默认赋值~
{
int i;
}
或者
struct aa //什么都不传,他默认赋值~
{
int i;
public aa(int j)
{
this = aa(); //丫也不报错
}
}
其实大概就是这样...~
我对于结构的使用是非常少. 因为我不觉得他能带来性能上的提升
怎么说. 比如结构中包含值类型怎么办,他还是放在线程栈上面? 恐怕是放在托管堆上面了吧
摊手
类型构造器
对于类型构造器,那使用的更少...
类型构造器你不用过去调用它,他自己会被clr调用.. 反正会先使用它,在你其他任何方法之前(包括其他构造函数);
默认私有
PS: 作者在这里提示,不要在结构中使用类型构造器,因为他有可能出不来
当然 相互引用这种事儿最好别干..
关于性能
第一次调用自然要消耗大一点,毕竟他要判断你是否是第一次.
以后调用就没问题了,编译器知道你已经被调用,自然就不会生成调用
操作符重载方法
比如 string + string,这个加就重载了的...
clr 规定重载操作符的方法 必须public + static
来一个例子
public class a
{
public static a operator+(a a1,a a2) { 这里面就可以写你想干什么了 }
}
这样就把+ 重载了
PS: 操作符我想不必深究。。 毕竟这玩意儿基本用不到 他顶多带来语法上的简便 仅此而已..
转换操作符方法
个人感觉和操作符一样,最大的意义就是操作简便。
关于规则
同样还是 public static 必须的!
implicit 隐式
explicit 显式~
有兴趣的自己研究一下吧.. 这里就带过了
扩展方法
同上.. 还是操作简便. 不过个人感觉这个方法提升很多操作的空间,这个用起来就好用太多
很多自定义的静态方法.. 就直接用了
public static class aaaa {
public static string Add(this string oldstr, string newstr)
{
return oldstr + newstr;
}
}
这样 你就能直接调用 "".Add("加上了") 啊哈~
PS:
扩展方法,就跟他名字一样.. 他只支持方法
非泛型静态类
至少得有个参数
比如 扩展方法写在 data 程序集下,那你在其他程序集中想用。 using data~
个人感觉以上的 类似语法糖的玩意儿意义不是很大..