为什么一个子类非static对象不能在显示调用父类构造函数时使用?不是在一个构造函数中吗

.Net技术 码拜 8年前 (2017-05-05) 1187次浏览
为什么一个子类static对象不能在调用父类构造函数时使用?不是在一个构造函数中吗?代码如下

class BackGround:GameObject
    {
        //首先先将图片导入,原因是我们需要将图片绘制到窗体中,子类的非static属性,若是static,就能正常调用不报错
        private   Image  imgBG = Resources.像素人bg;
        //写构造函数去调用父类的构造函数
        public BackGround(int x,int y,int speed):base(x,y,imgBG.Width,imgBG.Height,speed,0,Direction.Down)
        {
            int i=imgBG.Width;
        }
    }
解决方案

5

按照本人的理解,
当你通过构造函数使子类实例化时,
由于base(…) 会先执行父类的构造方法。
那么这个时候,其实子类并没有实例化,进入base时,也就没无法调用子类的字段和属性了。

5

        private   Image  imgBG = Resources.像素人bg;

public BackGround(int x,int y,int speed):base(x,y,<span style=”color: #FF0000;”>imgBG.Width,imgBG.Height</span>,speed,0,Direction.Down)
{
int i=imgBG.Width;
}
这个在编译之后的实际代码是这样的

        private   Image  imgBG;
 
        public BackGround(int x,int y,int speed):base(x,y,<span style="color: #FF0000;">imgBG.Width,imgBG.Height</span>,speed,0,Direction.Down)
        {
            imgBG = Resources.像素人bg;
            int i=imgBG.Width;
        }

所谓“变量声明初始化”,都是 c# 的语法糖。.net 并没有什么变量声明时进行初始化的功能,纯粹是 c# 的功能,而不是 .net framework 的功能。你看看编译之后的代码(的反编译结果)就知道了。

5

要区分哪些功能是 c# 的,那些是 .net framework 的。不要把 c#的功能总是误认为是 .net 的,同样也不要把 vb.net 的功能说成是 .net 的。

5

了解下静态区 堆 和栈你就懂了。看看反编译。
静态成员是由静态构造函数里去申请和开辟。他会一直存在也是最优先的。
堆空间是放引用类型的,引用类型的成员都是由 构造函数里去申请和开辟 退出方法体就回被标记为回收。
实例化对像的时候会先从顶级父类的构造函数开始操作

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明为什么一个子类非static对象不能在显示调用父类构造函数时使用?不是在一个构造函数中吗
喜欢 (0)
[1034331897@qq.com]
分享 (0)