C# 修饰关键字解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: C# 修饰关键字解析

01 struct

结构是一种值类型,比如 int,无需 new 来实例化,它在栈中分配空间;而类是引用类型,它在堆中分配空间,栈中保存的只是引用。

由于结构是值类型,并且直接存储数据,因此在一个对象的主要成员为数据且数据量不大的情况下,使用结构会带来更好的性能。

class Program  
{  
    static void Main(string[] args)  
    {  
        NewYorkTime? currentTime = null;    // 结构类型也是值类型,可以声明为可空  
    }  
}  
struct NewYorkTime  
{  
    private int hours, minutes, seconds;  
  // 可定义构造函数,但不能定义无参构造函数
    public NewYorkTime(int hh, int mm)  
    {  
        hours = hh;  
        minutes = mm;  
        seconds = 0;  
    }  
}  

02 abstract

作为 抽象类 和 抽象方法 的修饰

抽象类不可以实例化,只能作为其他类的基类

抽象方法只有签名,即函数名,返回值和参数列表,没有具体的函数体

当类继承抽象类时,需要实现 所有 的抽象成员,包括方法、属性等。

// 抽象类
public abstract class Person
{
    public abstract string SayHello();
}
// 派生类
public class Chinese : Person
{
    public override void SayHello()
    {
        System.Console.WriteLine("您好");
    }
}

03 interface

接口是一种代码规范,继承该接口的 类和结构 需要实现其所有成员,接口不能包含数据和静态成员。

// 接口
public interface IPerson
{
    // 默认为public,不需要加任何修饰符
    void SayHello();
    string Name { get; set; }
}
// 接口实现
public class American : IPerson
{
    public void SayHello()
    {
        System.Console.WriteLine("Hello");
    }
    public string Name { get; set; }
}

interface 和 abstract 区别


类只能继承一个抽象类,但可以有多个接口

类继承接口后,需要实现其所有成员,包括方法、属性、事件等


04 virtual/override/new


virtual用于定义一个虚方法,且所定义的方法可以包含方法体,并且允许在派生类中重写override对象,重写之后父类中的方法即被覆盖。


new除了用于实例化对象之外,还可以作为修饰符,表示显式隐藏父类中同名的方法,但不覆盖父类中的方法。

public abstract class Person
{
    // 不能包含方法体
    public abstract void SayHello() ;
    // 可以有方法体
    public virtual void SayHello1()
    {
        System.Console.WriteLine("Say something");
    }
}
public class Chinese : Person
{
    // 在派生类中重新实现虚方法
    public override void SayHello1()
    {
        System.Console.WriteLine("您好");
    }
}
public class Japanese : Person
{
    // 注意new ,表示显式隐藏父类里的同名函数,而不是重新实现
    public new void SayHello1()
    {
        System.Console.WriteLine("こんにちは");
    }
}
// 执行基类方法
Person japaneseOne = new Japanese();
japaneseOne.SayHello1();// 输出结果“Say something”
// 执行派生类方法
Japanese japaneseTwo = new Japanese();
japaneseTwo.SayHello1();// 输出结果“こんにちは”

05 sealed


密封类不能被继承,因此不能和abstract同时使用,密封方法表示重写后的方法不能再一次被重写,即必须与 override 连用。


通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱,恰当的利用 sealed 修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员。

// 密封类
class A {}
sealed class B : A {} // B继承A,但B不能被任何其他类继承
// 密封方法
public class A  
{  
    protected virtual void M() { Console.WriteLine("A.M()"); }  
    protected virtual void M1() { Console.WriteLine("A.M1()"); }  
}  
public class B : A  
{  
    protected sealed override void M() { Console.WriteLine("B.M()"); }  
    protected override void M1() { Console.WriteLine("B.M1()"); }  
}  
public sealed class C : B  
{  
    /* ConsoleApplication1.MSFun.Sealed.C.M()': 
     * cannot override inherited member 'ConsoleApplication1.MSFun.Sealed.B.M()' 
     * because it is sealed */  
    //protected override void M() { Console.WriteLine("C.M()"); }  
    protected override void M1() { Console.WriteLine("C.M1()"); }  
}

参考资料

c#中abstract、override、new、virtual、sealed使用和示例

C#中抽象类,INTERFACE,ABSTRACT、OVERRIDE、VIRTUAL、SEALED使用

相关文章
|
4月前
|
C# Windows
visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】
这篇文章提供了Visual Studio 2022社区版C#环境的搭建和安装使用指南,包括下载、安装步骤和创建C#窗体应用程序的详细图文解析。
visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】
|
21天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
17天前
|
存储 监控 算法
企业内网监控系统中基于哈希表的 C# 算法解析
在企业内网监控系统中,哈希表作为一种高效的数据结构,能够快速处理大量网络连接和用户操作记录,确保网络安全与效率。通过C#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
|
2月前
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
61 7
C# 9.0 新特性解析
|
1月前
|
Java 程序员
面试官的加分题:super关键字全解析,轻松应对!
小米,29岁程序员,通过一个关于Animal和Dog类的故事,详细解析了Java中super关键字的多种用法,包括调用父类构造方法、访问父类成员变量及调用父类方法,帮助读者更好地理解和应用super,应对面试挑战。
44 3
|
27天前
|
安全 编译器 C++
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
33 0
|
2月前
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
47 2
|
3月前
|
开发框架 Cloud Native .NET
10 个 C# 关键字和功能
10 个 C# 关键字和功能
74 8
|
5月前
|
网络协议 Java 数据库连接
13 Java异常(异常过程解析、throw、throws、try-catch关键字)
13 Java异常(异常过程解析、throw、throws、try-catch关键字)
140 2
|
5月前
|
C# 索引
C#中的virtual和override关键字
C#中的virtual和override关键字
54 3

推荐镜像

更多