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

一.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. Redis 工具类 java 实现的redis 工具类

    最近了解了一下非关系型数据库 redis 会使用简单的命令 在自己本地电脑 使用时必须先启动服务器端 在启动客户端 redis 简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内 ...

  2. Linux中***配置

    Ubuntu系统下: 1.执行如下命令 sudo apt install shadowsocks polipo 2.创建 shadowsocks.json 配置文件,放在你想放的位置 { " ...

  3. 小乐乐打游戏(BFS+曼哈顿距离)

    时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 小乐乐觉得学习太简单了,剩下那么多的时间好无聊 ...

  4. 1972 HH的项链

    传送门 主席树解法设las[ i ]表示数列中第 i 个数的值 上一次出现的位置,num[ i ]为原数列中第 i 个数的值1. 把 从第 1 到第 i 个数的 las 的值  的出现次数 建立一个线 ...

  5. day21 pickle json shelve configpaser 模块

    1. 序列化:我们在网络传输的时候,需要我们对对象进行处理,把对象处理成方便存储和传输的格式,这个过程就叫序列化 序列化的方法不一定一样,三十目的都是为了方便储存和传输. 在python中有三种序列化 ...

  6. Asp.net获取系统信息

    [DllImport("kernel32")]        public static extern void GlobalMemoryStatus(ref MEMORY_INF ...

  7. 自动截取sql并合并,生成执行HQL

    ### 提取SQL语句 FILE_PATH="/data/SCRIPT" cat tables | while read file do echo "-----> ...

  8. Zookeeper查看版本

    [root@ooccpp lib]# Zookeeper version: ---, built on // : GMT Clients: /[](queued=,recved=,sent=) /[] ...

  9. 笔记_简明Python教程_Byte_of_Python

    1. 局部变量.全局变量 局部变量: x = 50 def func(x): x = 2 print('Change local x to',x) func(x) print('x is still' ...

  10. Linux7.3 glib-2.49安装记录

    由于 Linux系统较新,所在glib选择了较新的glib-2.49,安装过程遇到颇多错误,这里只记录正确的成功的安装记录. # rpm -q ncurses readline lua libffi ...