Skip to content

C# 关键字及其对组件版本控制的影响

🏷️ 《CLR via C#》

类型

  • abstract

    表示不能构造该类型的实例

    cs
    abstract class AbstractClassA : Object
    {
        /// <summary>
        /// 虚方法
        /// </summary>
        public virtual void MethodA()
        {
            Console.WriteLine($"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}");
        }
    
        /// <summary>
        /// 抽象方法
        /// </summary>
        public abstract void MethodB();
    
        /// <summary>
        /// 实例方法
        /// </summary>
        public void MethodC()
        {
            Console.WriteLine($"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}");
        }
    }
  • virtual

    (不允许)

  • override

    (不允许)

  • sealed

    表示该类型不能用作基类型

    cs
    sealed class SealedClassA
    {
    }

    如果继承该类会报如下错误:

    无法从密封类型“SealedClassA”派生
  • new

    表示该成员与基类中相似的成员无任何关系(仅可修饰嵌套类型)

    cs
    class NestClass
    {
        new class SubNestClass
        {
        }
    }

    上述代码会有警告,不清楚何种情况下使用 new 修饰 class 才能没有警告。

    成员“NestClass.SubNestClass”不会隐藏可访问成员。不需要关键字 new。

方法/属性/事件

  • abstract

    表示为了构造派生类型的实例,派生类型必须重写并实现这个成员

  • virtual

    表示这个成员可由派生类型重写

    cs
    class ClassA
    {
        public virtual void MethodA()
        {
            Console.WriteLine($"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}");
        }
    }
  • override

    表示派生类型正在重写基类型的成员

    cs
    class ClassB : ClassA
    {
        public override void MethodA()
        {
            Console.WriteLine($"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}");
        }
    }
  • sealed

    表示这个成员不能被派生类型重写,只能将该关键字应用于重写虚方法的方法

    cs
    class ClassB : ClassA
    {
        public sealed override void MethodA()
        {
            Console.WriteLine($"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}");
        }
    }
  • new

    表示该成员与基类中相似的成员无任何关系

    cs
    class ClassC : ClassB
    {
        public new void MethodA()
        {
            Console.WriteLine($"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}");
        }
    }

常量/字段

  • abstract

    (不允许)

  • virtual

    (不允许)

  • override

    (不允许)

  • sealed

    (不允许)

  • new

    表示该成员与基类中相似的成员无任何关系

    cs
    class ClassB : ClassA
    {
        public string Name;
    }
    cs
    class ClassC : ClassB
    {
        public new string Name;
    }