C# 子类 父类 初始化问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 子类 父类 初始化问题相关的知识,希望对你有一定的参考价值。

using System;
class A

public static int X;
static A()
X=B.Y+1;


class B :A

public static int Y=A.X+1;
static B()
static void Main()
Console.WriteLine("X=0,Y=1",A.X,B.Y);


产生的输出结果是什么?
x=1,y=2

为什么 答案是x=1,y=2
怎么理解 谢谢

参考技术A 首先程序执行B构造函数,构造函数是给属性赋值作用,此时int类型的Y = 0;
然后程序执行了A构造函数X=B.Y+1; B.Y = 0所以 X = 1;
然后程序又执行 Y=A.X+1; A.X=1.所以Y = 2;
理论:构造函数优先执行权,
所以类中任何属性 默认都是有值,int是0 string是null,
然后才会执行我们的 声明属性值
如果没有构造函数给属性默认值,直接执行 int Y=A.X+1;的声明值,那程序就无限执行了,

执行顺序是
B.Y = 0;
A.X = B.Y+1;
B.Y = A.X+1;
可见B.Y是被改过一次值的,只是B.Y = 0;这一个初始化执行 你在代码里没看到而已
参考技术B

由于程序的入口点(Main)在Class B中。所以Class B一定是最先被初始化的。


那么下面我相信楼主你一定知道为什么了。


    初始化B.Y

    访问A.X(此时B的静态构造函数,已经被调用过一次了,不会再进行初始化,与静态构造函数的调用)所以X=0+1

    Y=1+1

本回答被提问者和网友采纳
参考技术C static B()这个方法干嘛用的?有存在的必要么?

C# 父类代码动态转换子类

百度上搜索C# 如何父类运行时转换成子类,没有得到相应答案,突然想起C# 有dynamic类型试试看结果成功了。。。

以后编写代码类似这样的代码 就可以删减掉了

if (en.type == EMapEntity.Construction)
                
                en.construction = new ConstructionPOD();
            
            if (en.type == EMapEntity.Creature)
            
                en.creature = new CreaturePOD();
            


using System;
using System.Reflection;

class BaseOrm

    public int hp = 10;

class RoleOrm : BaseOrm

    public string name = "盘子脸";

class Program

    static void Main(string[] args)
    
        string scriptName = "RoleOrm";
        Assembly a = Assembly.GetExecutingAssembly();
        Type t = a.GetType(scriptName, true);
        dynamic obj = Activator.CreateInstance(t);
        Console.WriteLine(obj.hp);
        Console.WriteLine(obj.name);
        RoleOrm r = obj;
        r.name = "plateface";
        Console.WriteLine(r.name);
        Console.ReadLine();
    

以上是关于C# 子类 父类 初始化问题的主要内容,如果未能解决你的问题,请参考以下文章

初始继承和多态

请问Java能不能直接用子类初始化父类?

java 初始化其子类必先初始化其父类啥意思

Python中子类怎样调用父类方法

java 编写一个子类(选择在子类中初始化父类成员方法)

关于模版子类初始化模版父类,调用父类成员问题(未解决)