sealed关键字——密封类

       与抽象类相反,在实际编程过程中,有的类已经没有在被继承的必要了。针对这种情况,C#提出了一个密封类的概念。密封类的声明使用sealed关键字,可以防止非有意的派生。如果视图将一个密封类作为基类,C#将提示出错。并且,密封类不能同时是抽象类,因为抽象类是希望被继承的。由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。当sealed关键字修饰方法或属性时,sealed必须与override一起使用.

由于结构是隐式密封的,因此他们不能被继承。

sealed class SealedClass
{
public int x;
public int y;
}
class Program
{
static void Main(string[] args)
{
//密封类的使用
SealedClass sc=new SealedClass();
sc.x=110;
sc.y=110;
Console.Writeline("x={0},y={1}",sc.x,sc.y);
}
}
输出的结果为 x=110,y=110

### C# 中 `const` 修饰符用于类对象的规则 在 C# 中,`const` 关键字主要用于定义编译时常量。对于基本数据类型(如整数、浮点数、字符和字符串),可以直接声明为常量并赋初值。然而,当涉及到类类型的成员变量时,情况有所不同。 #### 类型限制 - 对于引用类型(例如类实例),`const` 只能应用于那些可以被视作不可变的对象。这意味着一旦创建了该对象,则其状态不能再改变。 - 实际上,在 C# 中不允许直接将类实例标记为 `const`,因为这会违反上述原则——即无法确保整个对象图在其生命周期内保持不变[^1]。 #### 替代方案 为了实现类似于其他编程语言中的静态常量行为,通常有几种替代方法: ##### 使用 readonly 字段 如果希望某个字段在整个应用程序运行期间都指向同一个对象而不允许重新分配新的引用,应该考虑使用 `readonly` 而不是 `const`: ```csharp public class Example { public static readonly DateTime EpochStart = new DateTime(1970, 1, 1); } ``` 这里定义了一个名为 `EpochStart` 的只读字段,它会在第一次访问时初始化一次,并且之后就不能再修改它的引用目标了。 ##### 静态构造函数与私有构造器组合 通过这种方式可以在不暴露公共构造器的情况下控制如何创建这些所谓的“常量”对象: ```csharp public sealed class ColorConstants { private ColorConstants() {} public static readonly Color Red = System.Drawing.Color.Red; public static readonly Color Green = System.Drawing.Color.Green; public static readonly Color Blue = System.Drawing.Color.Blue; static ColorConstants() {} } ``` 在这个例子中,`ColorConstants` 是一个密封类 (sealed),并且有一个私有的无参构造器来防止外部继承或实例化;而内部则包含了几个预设颜色作为静态只读属性供外界调用。 #### 示例代码展示 下面给出一段完整的示例程序,展示了如何利用以上提到的技术模拟 `const` 表现效果: ```csharp using System; namespace ConstExample { /// <summary> /// A simple immutable class. /// </summary> public class ImmutablePerson { public string Name { get; } internal ImmutablePerson(string name) => this.Name = name ?? throw new ArgumentNullException(nameof(name)); // Prevent inheritance since we want our instances to remain truly immutable. private ImmutablePerson() : this(""){} } public static class PersonFactory { private static readonly Lazy<ImmutablePerson> _johnDoeLazy = new(() => new ImmutablePerson("John Doe")); public static ImmutablePerson JohnDoe => _johnDoeLazy.Value; } class Program { static void Main(string[] args) { Console.WriteLine(PersonFactory.JohnDoe.Name); // Output: John Doe try{ var johnClone = PersonFactory.JohnDoe with{}; // This will fail at compile time because 'with' keyword cannot be used on non-record types without property setters. }catch(Exception ex){ Console.WriteLine($"Error occurred: {ex.Message}"); } // Note that you also cannot do something like below due to immutability enforced by lack of setter properties: // PersonFactory.JohnDoe.Name = "Jane Smith"; } } } ``` 此代码片段不仅实现了类似 `const` 的功能,还强调了不可变性的概念,这对于维护线程安全性和简化调试过程非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值