C# 修饰关键字解析

简介: 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使用

相关文章
|
1月前
|
C#
30.C# 关键字 this初步学习
30.C# 关键字 this初步学习
15 1
|
1月前
|
C#
28.c#关键字base初步学习
28.c#关键字base初步学习
11 0
|
1月前
|
C#
27.c#关键字sealed修饰类
27.c#关键字sealed修饰类
12 0
|
2月前
|
架构师 安全 Java
资深架构师带你解析Synchronize关键字原理
众所周知 Synchronize 关键字是解决并发问题常用解决方案,有以下三种使用方式:
28 0
|
2月前
|
SQL 开发框架 .NET
EntityFramework数据持久化复习资料3、C#拓展方法与yield关键字使用
EntityFramework数据持久化复习资料3、C#拓展方法与yield关键字使用
22 0
|
3月前
|
Java C#
C# 面向对象编程解析:优势、类和对象、类成员详解
OOP代表面向对象编程。 过程式编程涉及编写执行数据操作的过程或方法,而面向对象编程涉及创建包含数据和方法的对象。 面向对象编程相对于过程式编程具有几个优势: OOP执行速度更快,更容易执行 OOP为程序提供了清晰的结构 OOP有助于保持C#代码DRY("不要重复自己"),并使代码更易于维护、修改和调试 OOP使得能够创建完全可重用的应用程序,编写更少的代码并减少开发时间 提示:"不要重复自己"(DRY)原则是有关减少代码重复的原则。应该提取出应用程序中常见的代码,并将其放置在单一位置并重复使用,而不是重复编写。
51 0
|
3月前
|
开发框架 .NET 编译器
C# 9.0中的静态匿名函数:引入static关键字的新用法
【1月更文挑战第15天】C# 9.0为匿名函数带来了一个新的修饰符static,允许开发者明确指定匿名函数不会捕获其包含作用域中的任何变量。这一特性增强了代码的性能和可读性,同时减少了因不小心捕获变量而导致的潜在错误。本文将详细探讨C# 9.0中静态匿名函数的语法、使用场景以及它们如何影响代码的性能和安全性。
|
11天前
|
XML C# 数据格式
C# 解析XML文件
C# 解析XML文件
17 1
|
1月前
|
数据采集 API C#
网页解析高手:C#和HtmlAgilityPack教你下载视频
使用C#和HtmlAgilityPack解析小红书网页,下载其视频内容。文章涵盖了解析网页、获取视频链接、C#实现、HtmlAgilityPack简化解析、代理IP确保下载稳定及多线程提高下载效率。提供的代码示例展示了如何设置代理和多线程下载视频。实验结果显示,该方法能有效、高效地下载小红书视频。
网页解析高手:C#和HtmlAgilityPack教你下载视频
|
1月前
|
算法 编译器 C++
【C++ 泛型编程 进阶篇】:C++ 元模版编程 typename关键字的多种用法全解析
【C++ 泛型编程 进阶篇】:C++ 元模版编程 typename关键字的多种用法全解析
36 0

推荐镜像

更多