C#:继承过程中的静态成员

在知乎上看到一个关于“泛基“的实现,感觉挺有意思,想试试效果,代码如下:

    public abstract class MyBase<T> where T : MyBase<T>{public static string DataForThisType { get; set; }public static T Instance { get; protected set; }public static readonly IReadOnlyDictionary<string, MemberInfo> Members = typeof(T).GetMembers().ToDictionary(x => x.Name);}public class MyClass : MyBase<MyClass>{static MyClass(){DataForThisType = string.Format("MyClass got {0} members", Members.Count);Instance = new MyClass();}}
    class Program{static void Main(string[] args){Console.Write(MyClass.DataForThisType);Console.WriteLine();Console.ReadLine();}}

先忽略这段代码的作用,重点是运行后控制台没有任何输出。跟踪一下发现根本没有走MyClass(),DataForThisType的值一直是null。关于静态构造方法,网上的解释是:

    • 通常情况下:最先调用基类的构造方法,但如果该类有静态构造方法,且首次调用该类,则先调用该类的静态构造方法,再调用其基类的静态构造方法。
      Child.Static->Super.Static->Super.Instance->Child Instance
    • 静态构造方法是.net调用的,在创建第一个实例或者静态成员被引用时,.net将自动调用静态构造方法来初始化类。

这就有问题了,MyClass的静态构造方法不仅没被优先调用,甚至全程都没有被调用。难道上述这个说法是错的?为了排除干扰,给上述代码简化一下

 

    class Program{static void Main(string[] args){Console.Write(TestChild.StaticPropertyBase);Console.WriteLine();Console.ReadLine();}}public class TestBase{public static string StaticPropertyBase { get; protected set; }}public class TestChild : TestBase{static TestChild(){StaticPropertyBase = typeof(TestChild) + ":" + "StaticPropertyBase";      }}

 

运行结果还是一样,没有输出,TestChild的静态构造没被执行。回头再来看静态构造方法的调用条件:在创建第一个实例或者静态成员被引用时!!!实例是肯定没有的,但

是我有引用静态成员啊..等等,我引用的好像是父类的静态成员,难道父类的静态成员不行?说好的继承全部家产呢?那就再来试试,给TestChild声明一个自己的静态属性。

   class Program{static void Main(string[] args){Console.Write(TestChild.StaticPropertyChild);Console.WriteLine();Console.Write(TestChild.StaticPropertyBase);Console.WriteLine();Console.Write(TestBase.StaticPropertyBase);Console.WriteLine();Console.ReadLine();}}public class TestBase{public static string StaticPropertyBase { get; protected set; }}public class TestChild : TestBase{public static string StaticPropertyChild { get; set; }static TestChild(){StaticPropertyBase = typeof(TestChild) + ":" + "StaticPropertyBase";StaticPropertyChild = "StaticPropertyChild";           }}

输出如下:

目前为止可以得出两个结论:

1)想触发一个类的静态构造方法?要么实例化它,要么访问它的静态成员,访问它基类的的静态成员是不行的。

2)静态成员的继承其实并不是真正的继承,或者说根本就无法继承,只是访问父类的静态成员而已。但与实例成员不同的是,用protected修饰的静态成员

     可以在其派生类中访问,用protected修饰的非静态成员,则不可访问。下面代码体会一下,new TestBase().hh =" ";这句报错。

     报错的原因描述有误:实则是因为在一个实例中访问了另一个实例的protected成员,与是否是基类的实例无关

 public class TestBase{public static string StaticPropertyBase { get; protected set; }public  string hh { get; protected set; }}public class TestChild : TestBase{public static string StaticPropertyChild { get; set; }static TestChild(){StaticPropertyBase = typeof(TestChild) + ":" + "StaticPropertyBase";StaticPropertyChild = "StaticPropertyChild";           }TestChild(){hh = "";new TestBase().hh = "";}}

以上、欢迎交流指正。如有侵权,请联系作者删除。

 

转载于:https://www.cnblogs.com/nevermore-wd/p/8569267.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 分享功能大全

实现效果&#xff1a; 实现步骤&#xff1a; 1、配置SDK 2、 配置平台SDK demo云盘链接&#xff1a;https://pan.baidu.com/s/1DRr85PKtVpuexfyCc2jwsg 在线交流密码&#xff1a;QQ1085220040 demo链接&#xff1a;https://download.csdn.net/download/meixi_android/112506…

Android list转xml

1、实体类class KeyValue {private String name;private String value;public KeyValue(String name, String value) {this.name name;this.value value;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getValue…

fiddler手机端抓包配置

首先&#xff0c;你得安装fiddler&#xff0c;这是前提条件&#xff0c;手机抓包有必须条件&#xff1a; 需要保持电脑和手机在同一个局域网中 &#xff08;这一点&#xff0c;我一般会在电脑上启动一个wifi&#xff0c;然后手机连接即可&#xff09; 下面说一下如何配置&#…

垃圾回收与算法

前边讲到 JVM 运行时内存的地方&#xff0c;关于新生代、老年代中 GC 垃圾回收以及垃圾回收算法&#xff0c;不知是否有点懵懵的&#xff0c;这篇一起了解一下垃圾回收以及垃圾回收算法。 一、垃圾回收需要完成的三件事 哪些内存需要回收&#xff1f;——垃圾对象&#xff08;如…

Android 起调手机QQ,联系客服

1、起调QQ聊天 public void toQQ(){// 跳转之前&#xff0c;可以先判断手机是否安装QQif (isQQClientAvailable(this)) {// 跳转到客服的QQString url "mqqwpa://im/chat?chat_typewpa&uin200870769";Intent intent2 new Intent(Intent.ACTION_VIEW, Uri.p…

spring boot与spring cloud版本匹配关系

Spring Cloud版本 在写本篇文章时&#xff0c;Spring Cloud版本演进情况如下&#xff1a; 版本名称版本Finchleysnapshot版Edgwaresnapshot版Dalston SR1当前最新稳定版本Camden SR7稳定版本Brixton SR7稳定版本Angel SR6稳定版本从下Angel到上Finchley可以看出&#xff0c;版本…

jeecg中excel导出字段判空处理

jeecg中excel导出字段判空处理 我们清楚&#xff0c;jeecg 导出 excel 采用的是 easypoi&#xff0c;不知道是否遇到过这种情况&#xff1a; 我们以一个实体属性为例&#xff1a; Excel(name"问题分类",dicCode"xx")private java.lang.String mwoQuestion…

InfluxDB配置文件详解

全局配置 # 该选项用于上报influxdb的使用信息给InfluxData公司&#xff0c;默认值为false reporting-disabled false # 备份恢复时使用&#xff0c;默认值为8088 bind-address ":8088" meta相关配置 [meta] # meta数据存放目录 dir "/var/lib/influxdb/me…

Android LinearLayout加载Fragment

为LinearLayout添加Fragment效果 1、创建Fragment public class Fragment1 extends Fragment {public static Fragment1 getInstance(Bundle bundle) {Fragment1 fg new Fragment1();fg.setArguments(bundle);return fg;}protected View contentView;Overridepublic View onC…

工作247:uniapp--实战--flex布局--商户星级

<template><view ><view v-for"(item,index) in 5"><view style"display: flex;padding: 24rpx 0 0 30rpx;"><text style"font-size: 30rpx;color: #333333;">001-祝菲</text><text style"margin-…

微信小程序开发实战基础一、页面跳转,底部导航栏,分享,加载图片标签,列表

1、页面跳转 wx.navigateTo({ url: "../four/four" })——可返回 wx.redirectTo({ url: "../four/four" })——不可返回 <view> <navigator url"../four/four" hover-class"changestyle">页面跳转&#xff0c;可以返回…

Java面向对象---重写(Override)与重载(Overload)

一、重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变&#xff0c;核心重写&#xff01; 重写的好处在于子类可以根据需要&#xff0c;定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。 重写方法…

Java集合List、Set、Map

集合是 java 基础中非常重要的一部分&#xff0c;同样也是 Java 面试中很重要的一个知识点。所以&#xff0c;给王小整理了这篇关于集合的文章。 1、接口继承关系以及实现 集合类存放于 Java.util 包中&#xff0c;主要有 3 种&#xff1a;set、list 和 map。 Collection&…

Could not find support-media-compat.aar

implementation(name: sdk-gp-4.4.4.0, ext: aar) 升级android studio到3.3版本&#xff0c;今天checkout到历史tag上运行android项目&#xff0c;死活报错 报错如下&#xff1a; Could not find support-media-compat.aar 或者如下报错&#xff1a; ERROR: Failed to reso…

SpringBoot项目修改html后不即时编译

SpringBoot项目修改html后不即时编译 springboot templates 下的 html 修改后无法达到即时编译的效果&#xff0c;搜索资料后记录笔记。原文地址&#xff1a;https://www.cnblogs.com/jiangbei/p/8439394.html 1、pom中引入依赖 <dependency> <groupId>org.spr…

工作250:uniapp--实战--flex布局--星级评分

<template><view ><view v-for"(item,index) in 5"><view style"display: flex;padding: 24rpx 0 0 30rpx;"><text style"font-size: 30rpx;color: #333333;">001-祝菲</text><text style"margin-…

微信小程序自定义变量使用,静态变量

1、创建变量 在js文件的data里面创建与赋初始值 data: { indicatorDots: true, autoplay: true, interval: 3000, duration: 500, a:10, time: (new Date().getHours()).toString(), time2: (new Date().getMonth()1).toString(), }, 2、自定义变量赋值与引用——chan…