C#面向对象几组关键字的详解(this,base,dynamic,var,const,readonly,is,as)
这几个关键字,在用法上有许多相似之处。这里主要看看细节之处的差异:
一.this和base的区别:
- this(本类相关):只能在和对象相关的地方使用。this表示的是当前对象;new的是哪个对象,这个this就表示的是哪个对象
- base(父类相关):表示调用父类的东西,或是父类构造方法
class Person
{
static Person()
{
Console.WriteLine("Person静态构造方法");
}
public Person()
{
Console.WriteLine("Person构造方法");
Console.WriteLine(this);
}
public virtual void Show()
{
Console.WriteLine("Person方法");
}
}
class Chinese : Person
{
static Chinese()
{
Console.WriteLine("Chinese静态构造方法");
}
public Chinese():base() //调用父类构造方法
{
Console.WriteLine("Chinese构造方法");
Console.WriteLine(this);
base.Show(); //父类对象调用
this.Show(); //本类对象调用
}
public override void Show()
{
Console.WriteLine("Chinese方法");
}
}
例子分析
调用:
static void Main(string[] args)
{
Person c = new Chinese();
Console.ReadKey();
}
输出信息:
Chinese静态构造方法
Person静态构造方法
Person构造方法
命名空间.Chinese
Chinese构造方法
命名空间.Chinese
Person方法
Chinese方法
静态构造方法与构造方法:
- 静态构造方法:先调用本类的静态构造方法,再调用父类
- 构造方法:先调用父类构造方法,在调用本类的
二.var和dynamic的区别:
- var(推断类型):变量的类型是在编译时决定的
- dynamic:变量的类型是在运行时决定的
static void Main(string[] args)
{
var name = ; //在编译时,根据右边的12就推测出左边的name为int
name = ""; //编译时,这句就会异常,string不能赋值int
dynamic age = ; //编译的时候不会去管age是什么类型,程序运行过程中再解析
age = ""; //这句会正常运行,程序运行解析为string类型
Console.ReadKey();
}
一般可能在下列情况使用dynamic:
- 动态语言对象
- 反射中动态创建对象
三.const和readonly的区别:
- const:const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值
- readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值
class Person
{
public Person() { }
public const string s1 = "const"; //所有的s1都替换成了“const”
public readonly string str = "值"; //这里的值可以运算中计算得出
public Person(string s)
{
str = s;
//s1 = "ww"; //这里s1就是一个常量了
}
}
例子分析
调用:
static void Main(string[] args)
{
System.Console.WriteLine(Person.s1);
Console.WriteLine(new Person().str);
Person p1=new Person("");
//p1.str=""; //只读字段这里是不能赋值的
Console.WriteLine();
Console.ReadKey();
}
四.is和as的区别:
- is(判断):is运算符用来检查对象(变量)是否属于某数据类型(如int、string、bool、double、class等),可在安全类型转换之前进行判断之用
- as(转换):as运算符用于执行引用类型的显式类型转换。如果要转换的类型与指定的类型兼容,转换就会成功进行;如果类型不兼容,as运算符就会返回值null
is表示对象是该类型,或者派生该类型:
static void Main(string[] args)
{
string str = "string";
int i = ;
Console.WriteLine(i is object); //true
Console.WriteLine(i is int); //true
Console.WriteLine(i is string); //false Console.WriteLine(str is object); //true
Console.WriteLine(str is int); //false
Console.WriteLine(str is string); //true
Console.ReadKey();
}
as只能转换引用类型,转换失败则返回null
static void Main(string[] args)
{
object obj = "string";
object o = ;
string str = obj as string; //string
string str2 = o as string; //null
Console.ReadKey();
}
C#面向对象几组关键字的详解(this,base,dynamic,var,const,readonly,is,as)的更多相关文章
- ava下static关键字用法详解
Java下static关键字用法详解 本文章介绍了java下static关键字的用法,大部分内容摘自原作者,在此学习并分享给大家. Static关键字可以修饰什么? 从以下测试可以看出, static ...
- Java并发关键字Volatile 详解
Java并发关键字Volatile 详解 问题引出: 1.Volatile是什么? 2.Volatile有哪些特性? 3.Volatile每个特性的底层实现原理是什么? 相关内容补充: 缓存一致性协议 ...
- Java面向对象之各种变量详解
在Java中一定有很多变量让大家头疼,成员变量.类变量.局部变量等等,今天就来分别认识认识他们吧! Java面向对象之各种变量详解 前言 在 Java语言中, 根据定义变量位置的不同,可以将变量分成两 ...
- 详解动态规划(Dynamic Programming)& 背包问题
详解动态规划(Dynamic Programming)& 背包问题 引入 有序号为1~n这n项工作,每项工作在Si时间开始,在Ti时间结束.对于每项工作都可以选择参加与否.如果选择了参与,那么 ...
- Java并发编程1--synchronized关键字用法详解
1.synchronized的作用 首先synchronized可以修饰方法或代码块,可以保证同一时刻只有一个线程可以执行这个方法或代码块,从而达到同步的效果,同时可以保证共享变量的内存可见性 2.s ...
- volatile关键字的详解-并发编程的体现
xl_echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! 参 ...
- Robot Framework(11)- 用户关键字的详解
如果你还想从头学起Robot Framework,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1770899.html 什么是用户关键字 ...
- [C/C++] extern关键字详解以及与static、const区别
extern用法详解: 1. 声明外部实体 声明外部全局变量或对象,一般用于头文件中,表示在其它编译单元内定义的变量,链接时进行外部链接,如: extern int ivalue; 此时的extern ...
- const关键字的详解
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰符,常类型是指使用类 ...
随机推荐
- git ssh密钥的使用
//配置邮箱,用户名, git config --global user.name git config --global user.email git config --global --list ...
- Mineweep(扫雷)
题目描述: 每周一题之2 Mineweep(扫雷) Minesweeper (扫雷) PC/UVa IDs: 110102/10189, Popularity: A, Success rate: h ...
- windows_study_4
描述:如何在虚拟外面访问虚机内的网站 解决:http://虚机ip.网站地址(http://192.168.124.41/wx/sites/tf/)
- 杭电ACM hdu 1398 Square Coins
Problem Description People in Silverland use square coins. Not only they have square shapes but also ...
- sofa-boot(1)helloworld项目
本示例参考:https://www.sofastack.tech/sofa-boot/docs/QuickStart 示例采用sofa-boot 3.1.1版本. 如下步骤: 1.进入https:// ...
- java中使用nextLine(); 没有输入就自动跳过的问题?
[问题分析] 必要的知识:in.nextLine();不能放在in.nextInt();代码段后面否则in.nextLine();会读入"\n"字符,但"\n" ...
- 使用springmvc时处理404的方法
使用springmvc时处理404的方法 来源: https://www.cnblogs.com/handsome-man/p/5519439.html,再次申明不是我原创的,尊重原创 如何定义404 ...
- SQL Server Reporting Service(SSRS) 第四篇 SSRS 常见问题总结
1. 如何让表头在每页显示(译) A. 打开高级模式: 在分组栏中点击Column Goups右侧的箭头选择高级模式; B. 找到第一个Static组 在Row Groups区域中(注意不是Colu ...
- grunt 合并压缩js和css文件(二)
具体node及文件配置请看: grunt 安装使用(一) 要压缩的文件 --src/ ajax.js assets.js touch.js zepto.js 目录结构: dist/ node_modu ...
- [PHP]对象数组和普通数组总结
1.碰到前台将JSON格式数据传递到服务器后台,经php的json_decode函数转换成的数组由于为对象数组,php程序无法对数据进行正常处理的情况,为此需要开发一个PHP回调函数(objarray ...