C# 修饰关键字解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 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使用

相关文章
|
3月前
|
存储 Java C#
C# 中的值类型与引用类型:内存大小解析
C# 中的值类型与引用类型:内存大小解析
|
19天前
|
前端开发 开发者 C#
深度解析 Uno Platform 中的 MVVM 模式:从理论到实践的全方位指南,助你轻松掌握通过 C# 与 XAML 构建高效可维护的跨平台应用秘籍
【8月更文挑战第31天】本文详细介绍如何在优秀的跨平台 UI 框架 Uno Platform 中实施 MVVM(Model-View-ViewModel)模式,通过一个简单的待办事项列表应用演示其实现过程。MVVM 模式有助于分离视图层与业务逻辑层,提升代码组织性、易测性和可维护性。Uno Platform 的数据绑定机制使视图与模型间的同步变得高效简便。文章通过构造 `TodoListViewModel` 类及其相关视图,展示了如何解耦视图与模型,实现动态数据绑定及命令处理,从而提高代码质量和开发效率。通过这一模式,开发者能更轻松地构建复杂的跨平台应用。
25 0
|
2月前
|
SQL 开发框架 前端开发
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
|
2月前
|
开发框架 .NET C#
【Azure Developer】C# / .NET 静态函数中this关键字的作用
在C#中,`this`关键字用于扩展方法,允许向已有类型添加功能而不修改其源代码。扩展方法必须在静态类中定义,且第一个参数使用`this`修饰,如`public static XElement AcquireElement(this XContainer container, string name, bool addFirst = false)`。这种方式增强了代码的可读性和类型的安全性,尤其在处理第三方库时。
|
3月前
|
存储 Java 数据库
Static关键字在Java中的多种用途解析
Static关键字在Java中的多种用途解析
|
3月前
|
JavaScript 前端开发 开发者
JavaScript中的const关键字解析
JavaScript中的const关键字解析
|
2月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
2月前
|
存储 Java 数据库
Static关键字在Java中的多种用途解析
Static关键字在Java中的多种用途解析
|
3月前
|
开发框架 安全 .NET
C#关键字概览
C#关键字概览
|
3月前
|
缓存 Java 编译器
必知的技术知识:Java并发编程:volatile关键字解析
必知的技术知识:Java并发编程:volatile关键字解析
19 0

推荐镜像

更多