C# 关键字及其对组件版本控制的影响
🏷️ 《CLR via C#》
类型
abstract
表示不能构造该类型的实例
csabstract 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}"); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23virtual
(不允许)
override
(不允许)
sealed
表示该类型不能用作基类型
cssealed class SealedClassA { }
1
2
3如果继承该类会报如下错误:
无法从密封类型“SealedClassA”派生
1new
表示该成员与基类中相似的成员无任何关系(仅可修饰嵌套类型)
csclass NestClass { new class SubNestClass { } }
1
2
3
4
5
6上述代码会有警告,不清楚何种情况下使用
new
修饰class
才能没有警告。成员“NestClass.SubNestClass”不会隐藏可访问成员。不需要关键字 new。
方法/属性/事件
abstract
表示为了构造派生类型的实例,派生类型必须重写并实现这个成员
virtual
表示这个成员可由派生类型重写
csclass ClassA { public virtual void MethodA() { Console.WriteLine($"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}"); } }
1
2
3
4
5
6
7override
表示派生类型正在重写基类型的成员
csclass ClassB : ClassA { public override void MethodA() { Console.WriteLine($"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}"); } }
1
2
3
4
5
6
7sealed
表示这个成员不能被派生类型重写,只能将该关键字应用于重写虚方法的方法
csclass ClassB : ClassA { public sealed override void MethodA() { Console.WriteLine($"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}"); } }
1
2
3
4
5
6
7new
表示该成员与基类中相似的成员无任何关系
csclass ClassC : ClassB { public new void MethodA() { Console.WriteLine($"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}"); } }
1
2
3
4
5
6
7
常量/字段
abstract
(不允许)
virtual
(不允许)
override
(不允许)
sealed
(不允许)
new
表示该成员与基类中相似的成员无任何关系
csclass ClassB : ClassA { public string Name; }
1
2
3
4csclass ClassC : ClassB { public new string Name; }
1
2
3
4