这几个关键字,在用法上有许多相似之处。这里主要看看细节之处的差异:

一.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:

    1. 动态语言对象
    2. 反射中动态创建对象

三.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)的更多相关文章

  1. ava下static关键字用法详解

    Java下static关键字用法详解 本文章介绍了java下static关键字的用法,大部分内容摘自原作者,在此学习并分享给大家. Static关键字可以修饰什么? 从以下测试可以看出, static ...

  2. Java并发关键字Volatile 详解

    Java并发关键字Volatile 详解 问题引出: 1.Volatile是什么? 2.Volatile有哪些特性? 3.Volatile每个特性的底层实现原理是什么? 相关内容补充: 缓存一致性协议 ...

  3. Java面向对象之各种变量详解

    在Java中一定有很多变量让大家头疼,成员变量.类变量.局部变量等等,今天就来分别认识认识他们吧! Java面向对象之各种变量详解 前言 在 Java语言中, 根据定义变量位置的不同,可以将变量分成两 ...

  4. 详解动态规划(Dynamic Programming)& 背包问题

    详解动态规划(Dynamic Programming)& 背包问题 引入 有序号为1~n这n项工作,每项工作在Si时间开始,在Ti时间结束.对于每项工作都可以选择参加与否.如果选择了参与,那么 ...

  5. Java并发编程1--synchronized关键字用法详解

    1.synchronized的作用 首先synchronized可以修饰方法或代码块,可以保证同一时刻只有一个线程可以执行这个方法或代码块,从而达到同步的效果,同时可以保证共享变量的内存可见性 2.s ...

  6. volatile关键字的详解-并发编程的体现

    xl_echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! 参 ...

  7. Robot Framework(11)- 用户关键字的详解

    如果你还想从头学起Robot Framework,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1770899.html 什么是用户关键字 ...

  8. [C/C++] extern关键字详解以及与static、const区别

    extern用法详解: 1. 声明外部实体 声明外部全局变量或对象,一般用于头文件中,表示在其它编译单元内定义的变量,链接时进行外部链接,如: extern int ivalue; 此时的extern ...

  9. const关键字的详解

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰符,常类型是指使用类 ...

随机推荐

  1. kuangbin专题十二 HDU1260 Tickets (dp)

    Tickets Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  2. github的使用 sourceTree

    http://www.cnblogs.com/Jenaral/p/5655958.html

  3. HIbernate | 简单对象嵌套实践

    src/entity/Course.java public class Course { private Integer courseNo; private String courseName; pu ...

  4. 「洛谷5017」「NOIP2018」摆渡车【DP,经典好题】

    前言 在考场被这个题搞自闭了,那个时候自己是真的太菜了.qwq 现在水平稍微高了一点,就过来切一下这一道\(DP\)经典好题. 附加一个题目链接:[洛谷] 正文 虽然题目非常的简短,但是解法有很多. ...

  5. DesiredCapabilities内容详解--Appium服务关键字

    上次了解了一些DesiredCapabilities的用法,有些还是不太清楚,去appium官网找了找官方文档,觉得写的很全: ## Appium 服务关键字 <expand_table> ...

  6. MySQL 关联查询 内连接

    内连接    [INNER| CROSS] JOIN无条件内连接:无条件内连接,又名交叉连接/笛卡尔连接第一张表种的每一项会和另一张表的每一项依次组合#例:mysql>  select  *  ...

  7. Yii2 urles

    public function rules(){ return [ //必须填写 ['email, username, password,agree,verifyPassword,verifyCode ...

  8. 二分搜索 - Binary Search

    二分搜索是一种在有序数组中寻找目标值的经典方法,也就是说使用前提是『有序数组』.非常简单的题中『有序』特征非常明显,但更多时候可能需要我们自己去构造『有序数组』.下面我们从最基本的二分搜索开始逐步深入 ...

  9. ArrayList中进行删除操作引发的问题

    1.普通for遍历 for(int i=0;i<list.size();i++){ if(list.get(i).equals("a")) list.remove(i); } ...

  10. 摄像机模型 (Camera Model)

    摄像机通过成像透镜将三维场景投影到摄像机二维像平面上,这个投影可用成像变换描述,即摄像机成像模型.摄像机成像模型有不同描述方式,本节首先介绍机器视觉中的常用坐标系,然后介绍摄像机的线性模型和非线性模型 ...