C# 属性设置为“get; private set;”好处

news/2024/6/18 6:25:47 标签: c#

在C#支持属性访问器权限控制的编程语言中,将属性设置为“get; private set;”有以下好处:

  1. 封装性:通过将 set 访问器设为 private,可以限制外部代码直接修改属性的值。这意味着只有该类内部的成员函数或构造函数才能更改Message的值,增强了数据的安全性和一致性,遵循了面向对象设计原则中的封装原则。

  2. 数据完整性:这样可以确保对属性值的修改符合类的设计逻辑和业务规则。例如,在设置 Message 的值时,可能需要执行一些额外的操作(如验证、格式化或触发事件等),这些操作可以在私有的 set 访问器中实现。

  3. 控制状态变化:防止类外部随意修改对象的状态,对于维护对象内部状态的一致性非常重要。比如在某些场景下,Message 可能只应在特定条件满足时才能被赋值,或者其赋值应当伴随着某种副作用。

  4. 提供更安全的API:对于公共接口而言,只读属性(只提供了 get 访问器)对外部使用者来说更加友好且不易出错,因为它不会意外地改变对象的内部状态。同时,如果确实需要在类内部更新该属性值,仍可通过 private set 来实现。

  5. 延迟初始化:在某些情况下,您可能希望在对象的构造函数之外初始化属性。通过将set访问器设置为private,您可以确保属性只在类的内部被设置,这可能涉及到延迟初始化或惰性加载。

  6. 不变性:在某些情况下,您可能想要确保对象的状态在创建后不会被修改。通过将属性设置为只读(使用public get; private set;),您可以在构造函数中设置属性值,并在之后防止它们被修改。

  7. 设计灵活性:将set访问器设置为private允许您在未来更改属性的内部实现,而不会影响使用该属性的客户端代码。

例如代码:

public class User
{
    // 只读公开的Message属性
    public string Message { get; private set; }

    // 构造函数,在创建对象时允许初始化Message
    public User(string initialMessage)
    {
        this.Message = initialMessage;
    }

    // 内部方法,用于安全地更新用户的消息
    public void UpdateMessage(string newMessage)
    {
        // 在这里可以添加额外的逻辑,比如验证、格式化或触发事件等
        this.Message = newMessage;
    }
}

// 使用示例:
var user = new User("Hello, World!");
Console.WriteLine(user.Message);  // 输出:Hello, World!

// 外部试图直接修改Message会编译错误
// user.Message = "New message";  // 错误,因为set是private的

// 但是可以通过UpdateMessage方法来合法且安全地更改Message
user.UpdateMessage("New message");
Console.WriteLine(user.Message);  // 输出:New message

 

 

 


http://www.niftyadmin.cn/n/5409175.html

相关文章

基于java的宠物常规护理知识管理系统

项目源码:https://gitee.com/oklongmm/biye2 在设计一个宠物常规护理知识管理系统时,我们需要考虑系统的可扩展性,易用性和稳定性。以下是系统设计的功能模块: 一、用户模块: 1. 注册与登录:用户可以通过…

第十三章P-tuing系列之P-tuning V1

项目地址: P-Tuning 论文地址: [2103.10385] GPT Understands, Too (arxiv.org) 理论基础 正如果上一节介绍LoRA(自然语言处理: 第十二章LoRA解读_lora自然英语处理-CSDN博客)一样,本次介绍的在21年由清华团推提出来的 P-Tuning V1系列也属于PEFT(参数高效微调系列)里的一种&…

Java 并发编程 面试题及答案整理,最新面试题

Java中的volatile关键字有什么作用? volatile关键字在Java中的作用包括: 1、保证可见性: 确保变量的修改对其他线程立即可见。 2、防止指令重排: 防止编译器对操作进行重排序,保证代码的执行顺序。 3、非原子性&am…

HUAWEI 华为交换机 配置 MAC 防漂移 防MAC伪造示例

组网需求 某企业网络中,用户需要访问企业的服务器。如果某些非法用户从其他接口假冒服务器的MAC 地址发送报文,则服务器的 MAC 地址将在其他接口学习到。这样用户发往服务器的报文就会发往非法用户,不仅会导致用户与服务器不能正常通信&…

Python 全栈系列232 再次搭建RabbitMQ

说明 最近想重新上RabbitMQ,主要目的还是为了分布式任务调度。在Kafka和RabbitMQ两者犹豫了一下,还是觉得RabbitMQ好一些。 在20年的时候有搞过一阵子的RabbitMQ,看了下当时的几篇文章,觉得其实想法一直没变过。 Python - 装机系列24 消息…

【深度学习】5_6 AlexNet

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 5.6 深度卷积神经网络(AlexNet) 在LeNet提出后的将近20年里,神经网络一度被其他机器学习方法超越&…

Netty HttpServerCodec和HttpObjectAggregator

GET请求 Get请求包括两个部分: request line(包括method,request uri,protocol version)) header HttpServerCodec是netty针对http编解码的处理类,但是这些只能处理像http get的请求,也就是数据带在url问号后面的http请求参数 PO…

【Tauri】(4):使用Tauri1.5版本+candle框架运行大模型,前后的搭建运行成功,整合前端项目

1,视频地址 关于tauri 框架 2,搭建rust 环境 # 设置服务器国内代理: export RUSTUP_DIST_SERVER"https://rsproxy.cn" export RUSTUP_UPDATE_ROOT"https://rsproxy.cn/rustup"# 设置环境变量 export RUSTUP_HOME/data/…