首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我要选择私有只读自动属性而不是只读字段?[已关闭]

选择私有只读自动属性而不是只读字段的原因主要涉及到封装性、可维护性和潜在的功能扩展。

基础概念

  1. 只读字段:只读字段在类中定义后,其值只能在声明时或在构造函数中初始化,之后无法更改。
  2. 私有只读自动属性:私有只读自动属性使用private set;来确保属性值只能在类内部设置,外部无法修改。

优势

  1. 封装性
    • 私有只读自动属性提供了更好的封装性,因为它们隐藏了字段的具体实现细节。外部代码只能通过属性访问数据,而不能直接访问字段。
    • 这有助于保护数据的完整性,防止外部代码意外修改数据。
  • 可维护性
    • 如果将来需要更改字段的实现细节(例如,从直接存储值改为计算值),使用私有只读自动属性可以更容易地进行这些更改,而不影响外部代码。
    • 只读字段则需要在声明时就确定其值,灵活性较差。
  • 功能扩展
    • 私有只读自动属性可以在内部使用更复杂的逻辑来设置属性值,例如从数据库读取数据、进行计算等。
    • 只读字段则只能在声明时或构造函数中设置值,无法进行复杂的逻辑处理。

类型

  • 私有只读自动属性public int MyProperty { get; private set; }
  • 只读字段private readonly int myField;

应用场景

假设你有一个类Person,其中有一个属性Age,你希望这个属性在对象创建后就不能被修改。

使用只读字段

代码语言:txt
复制
public class Person
{
    private readonly int age;

    public Person(int age)
    {
        this.age = age;
    }

    public int Age => age;
}

使用私有只读自动属性

代码语言:txt
复制
public class Person
{
    public int Age { get; private set; }

    public Person(int age)
    {
        Age = age;
    }
}

遇到的问题及解决方法

问题:为什么我使用只读字段时,外部代码仍然可以修改其值?

原因:这通常是因为只读字段在类的外部仍然可以通过反射机制进行修改。

解决方法

  1. 使用私有只读自动属性:如上所述,私有只读自动属性通过private set;确保属性值只能在类内部设置。
  2. 防止反射修改:如果必须使用只读字段,可以通过自定义属性或使用protected internal访问修饰符来限制反射访问。

参考链接

通过以上分析,你可以看到私有只读自动属性在封装性、可维护性和功能扩展方面具有明显优势,特别是在需要保护数据完整性和灵活处理数据的情况下。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

TIMSDK 常见问题

,为什么另一端收到此表情消息并解析出文本或超出我预期的情况?...默认是可以的,在 “云通信控制台 --> 应用配置 --> 功能配置 --> 单聊消息检验关系链” 编辑此属性,开启单聊消息检验关系链,非好友关系就不能收发消息,默认为关闭状态; 20.过期的资源文件还可以使用吗...暂不支持,setReadMessage() 是根据参数传入该条消息的时间戳之前的所有消息置为已读状态,填 NULL 将该会话的所有消息置为已读状态 23.我能获取进群前的历史消息记录吗?...; 2) 确认群组类型是否为私有群(Private), 可通过 getGroupType() 获取群类型; 3) 私有群(Private) 需要通过发送一条消息来激活群组; 10.为什么我创建了一个群组...字段,如果为空可以选择再去获取 nickName 或 identifier 展示在页面上; 16.TIMGroupMemberInfo 没有头像字段?

5.7K102

属性关键字OnDelete,Private,ReadOnly,Required

用法要指定属性为私有,请使用以下语法:Property name As classname [ Private ];否则,忽略该关键字或将Not放在该关键字之前。...详解私有类成员只能由该类(或其子类)的方法使用。在目录信息中不显示私有属性,并且不是由SELECT *查询返回的。 但是,可以在SQL查询中显式地引用和使用私有属性。...在IRIS中,私有属性总是被继承的,并且对定义属性的类的子类可见;其他语言经常调用这些受保护的属性。默认如果省略此关键字,则此属性不是私有的。...同样,当属性被定义为只读时,相应的SQL表中的字段也被定义为只读。不能通过SQL语句显式插入或更新只读字段。尝试这样做将导致SQL错误,SQLCODE为-138。...当插入或更新记录时, IRIS会属性的Required关键字。默认如果省略此关键字,则属性不是只读的。

73630
  • 你了解 Typescript 吗

    不能清楚地看到界限,开发者开始依赖具体类型而不是抽象接口,导致了紧密耦合。 3. TypeScript 使代码更易阅读和理解。 Reddit说 要支持强类型。 要有很好的配套工具。...参考 《为什么 Angular 2 改用 TypeScript 语言实现》 《为什么 Reddit 选择了 TypeScript?》...: number; // 指定属性 type: 1 | 2 | 3; // 只读属性 readonly x: number; // 函数类型 getArea(x: number): number...修饰符与private修饰符的行为很相似,但protected成员在派生类中仍然可以访问 readonly: 将属性设置为只读的,只读属性必须在声明时或构造函数里被初始化 class Person {...包括getter和setter,其实都是ES6而不是Typescript的特性。 但public、private、protected等,则是Typescript中增加的。

    5.6K10

    hhdb数据库介绍(10-2)

    如果不是当前管理平台部署出来的计算节点集群,该字段显示为空。...如果不是当前管理平台部署出来的计算节点集群,该字段显示为空。配置库:显示计算节点集群所用的配置库运行状态,同样如果不是当前管理平台部署出来的计算节点集群,该字段显示为空。...填写说明:(一)集群信息选择已部署集群的集群模式,不同模式输入的参数要求也不同。集群名称与当前已有计算节点集群名称不重复即可。...只读计算节点高可用只读计算节点的高可用切换和重建流程同普通模式一致,只是在切换/重建后是否会释放计算节点的只读属性根据只读计算节点的节点类型决定主计算节点开启只读,执行高可用切换并重建后,备切换为当前主...,原主计算节点为当前备且为只读模式切换前主节点为只读:切换并重建后原主节点切换为备节点依旧为只读模式:备计算节点开启只读,执行高可用切换并重建后,备切换为当前主并释放只读属性切换前备节点为只读:切换并重建后原备节点切换为当前主且释放只读

    6210

    语法基础(三十七)-修饰符总结

    abstract可以修饰抽象类中的方法或属性,此时,方法或属性不能包含实现,且访问级别不能为私有。 抽象类不能被实例化。...static可以修饰方法、字段、属性或事件,始终通过类名而不是实例名称访问静态成员,静态字段只有一个副本。 静态类不能被实例化。...readonly 使用readonly关键字来声明只读字段。 只读字段可以在声明或构造函数中初始化,每个类或结构的实例都有一个独立的副本。 可以与static一起使用,声明静态只读字段。...静态只读字段可以在声明或静态构造函数中初始化,静态常量字段只有一个副本。 virtual virtual关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。...override 要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用override修饰符。 重写的成员必须是virtual、abstract或override的。

    47620

    Html Notification通知的简单使用(转)

    但是,恕我愚钝,一直没想明白原理。难道Facebook和Chrome酱有合作,如果是这样那就是特例;如果不是,那通知是哪里发出的呢? 求达人解惑!...三、HTML5 Web Notification语法 window.Notification 如果浏览器支持Web Notification,不考虑私有前缀,则window.Notification就会是一个有很多静态属性和实例方法的函数...没错,true参数要想其作用,必须tag需要设置属性值。然后,通知就会像这样覆盖:而不会是默认的叠高楼: silent 布尔值。通知出现的时候,是否要有声音。默认false, 表示无声。...根据我自己的猜测,应该和position的sticky属性值类似。 4. Notification.close() 通知显示了,如何关闭呢?...可以通过调用Notification.close()实例方法,实际上,通知如果你放着不管,一段时间后就会自动隐藏,具体多久不详,我估摸着5秒有的。 5.

    2.9K10

    Unity基础教程系列——对象管理(二)对象多样化(Fabricating Shapes)

    理想情况下,此字段是只读的,因为形状实例始终是一种类型,并且不会更改。但是必须以某种方式为它分配一个值。我们可以将私有字段标记为可序列化,并通过每个预制件的检查器为其分配一个值。...因此,形状标识符取决于工厂,而不取决于预制件。 因此,这是每个实例而不是每个预制件要跟踪的东西。 默认情况下,私有字段不会序列化,因此预制与它无关。...getter部分只是返回私有字段。setter只给私有字段赋值。为此,setter有一个名为value的适当类型的隐式参数。 ? 通过使用属性,可以向看似简单的检索或赋值添加额外的逻辑。...为什么不直接使用只读(readonly)属性呢? 只读字段或属性只能分配默认值,或在构造函数方法中分配。但不巧的是,我们不能在实例化Unity对象时使用构造函数方法。所以只能使用这样的方法。...由于GameDataReader不是Unity对象类,我们可以使用只读属性,只给它一个get部分。这些属性可以通过构造函数方法初始化。为此,我们必须添加版本作为构造函数参数。 ?

    1.8K10

    C# 8 新增小功能

    就在几个星期前,我试图清理一些大量使用 get/set 属性的代码,使其成为一个更加只读的初始化的构造函数(ctor-initialized),此时我发现我真希望该特性是这样的。...结构上的只读成员 当分配给只读字段或用作 in 参数时,结构上的方法有个性能小问题。如果我们调用结构上的方法,编译器首先会生成防御性副本。...这向编译器表明,防御性副本不是必要的,没有值会被修改。 这和Pure 属性不同,只要只读方法不修改结构本身的值,那么就有明显的副作用。 自动实现属性的 getter 将被自动认为是只读的。...在某些情况下,setter 也可以被标记为只读。比如,当属性值存于字典中而不是直接存入结构本身的时候。 在目前的提议下,引用类型(类和接口)将不会受到该特性的支持。...原因有三重: 这么做,没有与性能相关的优势 只读关键字不意味着状态不会改变,只是不会直接修改对象上的字段。 这是只读结构的扩展,没有等效的只读类。

    53820

    java中关于set()和get()方法的理解和使用

    以下是返回私有字段 name 的值的 get 访问器:  类似java的私有属性,公开方法  private string name; // the name field  public string...备注:  属性按如下方式,根据所使用的访问器进行分类:只带有 get 访问器的属性称为只读属性。无法对只读属性赋值。 只带有 set 访问器的属性称为只写属性。...而不是直接对类的变量进行操作.有一个很大的作用就是: 便于维护.因为:如果一个类的一个变量int a ,在其它包或命名空间类中使用了1000次,但是过了许久,你想把a改为b,如果直接对变量a操作的话,就得需求修改整个程序的...满足一定条件让GET和SET来改变类中的私有变量,而不能让实例直接操作。像上面的代码保证了color属性的安全性。...既然如此可不可以写成set{color=value*20; //value是不是相当于Color的值} 我当初和你有一样的想法.但是现在改变了。举个例子说明一下吧.

    3.9K30

    女朋友问我:什么是 MySQL 的全局锁、表锁、行锁?

    2.2 为什么要加锁? 上面说了,利用全局锁备份会造成两个问题。那不加锁行吗?废话,肯定是不行的。不加锁,你养我呀(备份出问题被开除)?...不加锁同样会出现意想不到的问题:举个栗子,看电影买票,系统有个余额表和用户已购票表。 ? 为什么要加锁? 现在我要备份,期间有人买票。逻辑上:余额表减掉相应金额,已购票表加上一张票。...异常不释放状态;FTRWL 命令在异常发生时,会自动释放全局锁;而 set global read_only=1 在异常时,数据库会一直保持只读状态,这时候业务就完犊子了。...加个字段 前提:注意,我这里的事务是手动开启和提交的。而 MDL 锁是语句开始时申请,事务提交才释放。所以,如果是自动提交就不会出现下面的问题。...其中全局锁撩到了应用场景、为什么备份要加全局锁?如何利用一致性视图备份以及为啥 readonly = 1 不适合用来做备份?

    1.2K30

    JS 中的网络请求 AJAX, Fetch, WebSocket

    它监听readyState属性的变化,而它一共有 5 个值。 0 表示 请求还未初始化,尚未调用 open() 方法。 1 表示 已建立服务器链接,open() 方法已经被调用。...我们还需要关心status属性它也是只读属性,它是这次响应中的 HTTP 数字状态码。在请求之前和 XMLHttpRequest 出错时它为0。...3 连接已关闭或者没有链接成功s.send('hello') // 发送的数据必须是纯文本s.onopen = function (){ console.log('成功建立连接时触发') } s.onerror...一旦队列中的所有数据被发送至网络,则该属性值将被重置为0。但是,若在发送过程中连接被关闭,则属性值不会重置为0。 extensions 只读 返回服务器选择的扩展名。...服务器选择的下属协议 readyState 只读 当前的链接状态 url 只读 WebSocket 的绝对路径 2 个方法 close(code, reason) 数字状态码 可选 默认 1005和一个可选的类可读的字符串

    4.1K30

    临时工访谈:PolarDB Serverless 发现“大”问题了 之 灭妖记 续集

    WHY (后面找到的原因,不是我想的那样) 2 调整配置的问题,这单也非常的怪异,调整了serverless 上限PUC的数量,而变化的只有原来的两个固定的节点,而多出来的那个节点可是不听话,1-32...这次我长了一个心眼,在调整的时候,直接将多节点的个数下限直接选择成0 并且只读节点和个数上限直接选择成0。得到的结果是我要的结果。...使用者认为只读节点下限包含了我之前固定主机上的只读节点,而开发者或者设计者认为,这个不包含是你要在多购买一个,所以这不是一个大问题。...临时大妖:(这上来就过招,昨天提出的问题,今天就解决),挺好的,但是我昨天提出的第二个问题呢,就是为什么主节点提升了PCU 还要带着从节点也提升PCU 是什么道理呀,这是不是要占客户的便宜,让客户多付费呀...当然我们也有一套严谨的流程,让扩展的只读节点自动下线,当然比较复杂,具体看节点上业务的情况。 大妖,瞬间石化,他说的有道理呀!

    13910

    WebSocket

    WebSocket.bufferedAmount 只读 未发送至服务器的字节数。 WebSocket.extensions 只读 服务器选择的扩展。...WebSocket.protocol 只读 服务器选择的下属协议。 WebSocket.readyState 只读 当前的链接状态。 WebSocket.url 只读WebSocket 的绝对路径。...也可以通过 onclose 属性来设置。 error当一个 WebSocket 连接因错误而关闭时触发,例如无法发送数据时。 也可以通过 onerror 属性来设置。...WebSocket.extensions **WebSocket.extensions**是只读属性,返回服务器已选择的扩展值。目前,链接可以协定的扩展值只有空字符串或者一个扩展列表。...3 (WebSocket.CLOSED) 连接已关闭或者没有链接成功 WebSocket.url **WebSocket.url**是一个只读属性,返回值为当构造函数创建WebSocket实例对象时

    28220

    HTML5的Video标签详细说明手册

    这就是HTML 5的新标签带来的构想,他提供了一个嵌入视频(以及与其交互)而不需要类似Flash的私有插件的方法。 不幸的是,视频并非那么简单。...注意,HTML中布尔属性的值不是true和false。...2.7 source标签 Source标签用于给媒体(因为audio标签同样可以包含此标签,所以这儿用媒体,而不是视频)指定多个可选择的(浏览器最终只能选一个)文件地址,且只能在媒体标签没有使用src属性时使用...3.5 buffered属性 只读属性。使用media.buffered返回一个TimeRanges对象,确认浏览器已缓存媒介文件。 3.6 readyState属性 只读属性。...3.9 played、paused、ended属性 三者均为只读属性。 使用media. played返回一个TimeRanges对象,标明浏览器已播放的媒介资源范围。

    2K20

    python语法

    初始化金钱数,商品种类、价格,选择购买商品,直到钱不够,退出时打印已购买的商品和剩余金额。 开发文件替换小程序: 使用方法: ....定义在类里面的属性,属于类的,不属于对象,直接可以使用使用类名.属性名调用,如:上段代码中的Person.name。 属于类的字段称为静态字段。...通过self调用的称为动态字段(比如说:在__init__中调用的字段)。 类不能直接访问对象的属性,对象可以直接访问类的属性。..._class__privateFunctionName() 私有字段 在类中定义了私有字段,外部是不能访问的,只能通过在内部定义函数访问这个私有字段,外部调用该函数间接的访问该私有字段。...objName.Thailand  调用该对象的这个方法来访问私有字段。 私有字段一般用在不让别人改,但是可以访问的情况下。 对象的属性的只读和可改写:它们使用的装饰器不一样。

    1.2K30

    【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器

    一、搭建项目环境1.1、创建TDSQL-C Serverless我们选择 serverless 版本,因为我原来的数据库也是 mysql,所以这里为了更好的迁移过去,我也选择了 mysql5.7,同时这里还支持海外地区...,如果大家有海外项目也是可以选择这个产品的我们先去购买一个集群,这里很有意思,就是为什么买一个数据库叫一个集群呢?...访问量高时,它会自动给我们增加更多计算和存储资源,保证操作速度不受影响。而访问量如果变低了,它也会主动回收一些资源,帮我们节省开支。...就是像电梯一样,我们按了楼层按钮就可以乘坐,内部会自动打开和关闭电梯门。我们不需要考虑电梯具体的运作细节。TDSQL-C Serverless版的自动启停功能,也就是这种智能的“按需”运作机制。...目前测试脚本停下来后,只读服务器的CPU也降低下来了一台只读服务器,最多使用了 8% 的CPU,看下图总结这个体验流程就是这样,同时也回答一下为什么这个数据库是创建一个集群,而不是一个实例,其实通过我们的体验过程也不难发现

    25820
    领券