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构造函数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# 父类代码动态转换子类
百度上搜索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# 子类 父类 初始化问题的主要内容,如果未能解决你的问题,请参考以下文章