正确使用封装在类内属性中的字段

2024-02-24

我应该使用哪种场景来更改类方法/属性内的私有字段:

public class Example
{
 private int intVar = 0;
 private string stringVar = string.Empty;

 public int IntVar
 {
  get { return this.intvar; }
  set { this.intvar = value; }
 }

 public string StringVar 
 {
  get { return this.stringVar ; }
  set { this.stringVar = value; }
 }

 private void SomeMethod()
 {
  //change fields in this way:
  this.intVar = 50;
  this.stringVar = "changed";
  //or that way(through properties):
  this.IntVar = 50;
  this.StringVar = "changed";
 }
}

也许在这个例子中这没有什么区别,但是如果有人向属性添加额外的代码,并且通过属性更改字段会改变其他一些事情怎么办?

你能说哪种方式更好,或者实际上没有什么区别吗?

我知道从 C# 3.0 开始我可以编写自动实现的属性,但这是 C# 2.0。


我想说使用属性通常会更好。如果 getter 和 setter 很简单,那么它们无论如何都可能会在运行时因抖动而内联。正如您所说,也许会对财产代码进行其他更改。

一个常见的更改是通过实现 INotifyPropertyChanged 添加更改通知。如果您直接设置字段,听众将不会收到通知。

我更喜欢我的类使用它们自己的公共接口而不是内部接口。对我来说,一个例外是当我明确不想要任何副作用时。但这种情况很少发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正确使用封装在类内属性中的字段 的相关文章

随机推荐

  • 如何在 Django 中获取用户 IP 地址?

    如何在 Django 中获取用户的 IP 我有这样的看法 Create your views from django contrib gis utils import GeoIP from django template import Re
  • 如何在 Aurelia 中“继承”可绑定属性?

    我正在使用 TypeScript 开发 Aurelia 应用程序 在此应用程序中 我定义了一组自定义元素 每个元素共享一组可绑定属性 这些属性被转换为 css 设置 如以下简化示例所示 import computedFrom bindabl
  • 在 Azure Linux VM 中,什么仍然存在?什么磁盘收费?

    我在 Microsoft 的 Azure 中创建了一个小型 Linux VM 我还创建了一个 20GB BLOB 并将其安装为文件系统 在我的虚拟机上 我看到以下内容 根文件系统 约28GB 启动文件系统 约500MB 我的 20GB 文件
  • iphone AVEditDemo 或任何视频处理示例

    我正在尝试以某种方式处理视频 剪切和合并视频 录制屏幕并从该录制内容中制作视频 我也在互联网和 stackoverflow 上查找 看到苹果有一个名为 AVEditDemo 的代码示例 但我永远找不到它 如果有人有这个例子并愿意与我分享 或
  • 微软 Roslyn 与 CodeDom

    From a 新闻稿 http www infoworld com d application development microsofts roslyn reinventing the compiler we know it 176671
  • Laravel 5.5 将迁移与生产数据库合并

    希望我能很好地解释这一点 我有一个 Laravel 应用程序 已经投入生产了一分钟 所以 我有一堆包含很多更改的迁移文件 我想合并这些迁移文件而不丢失数据库 我的方式think这会起作用 将所有生产表迁移到所需状态 将所有迁移文件合并为所需
  • 如何列出 mongo shell 中的所有数据库?

    我知道怎么做列出特定数据库中的所有集合 https stackoverflow com questions 8866041 how to list all collections in the mongo shell 但是如何在 Mongo
  • mysqld_safe UNIX 套接字文件的目录“/var/run/mysqld”不存在

    使用 mysqld safe 启动 mysql 服务器 5 7 17 时 出现以下错误 2017 02 10T17 05 44 870970Z mysqld safe Logging to var log mysql error log 2
  • 从 XMLHttpRequest 对象中删除 cookie

    我正在使用 jquery 进行 ajax 调用 例如 ajax url path to webservice asmx beforeSend function xmlHTTPRequest modify headers here remov
  • 分页计算算法

    我正在尝试计算分页 var pagination total result length per page itemsPerPage required current page currentPage required last page
  • 用回形针圆角

    如何用回形针创建圆角 我找到了这个解决方案 它创建了使用convert options用回形针实现圆角 http loo no 2009 08 09 rounded corners with paperclip 但它不适用于 Rails 3
  • 跨浏览器事件对象规范化?

    我正在寻找有关事件对象的事件规范化的良好资源 我想自己做 但我总觉得我会错过一些东西 这是我到目前为止所掌握的 如果我错过了什么 请告诉我 var eFix function e e e window event e target e ta
  • Android,Cometd:Cometd 发送备用消息

    我正在开发一个 Android 应用程序 在其中实现聊天功能 考虑到 Cometd 的使用 聊天速度相当快 但由于某种原因 Cometd 正在发送备用消息 如果它发送message 1 则不发送message 2 然后发送3 依此类推 这是
  • 在 Svelte 中传递道具

    我正在尝试使用 Svelte Svelte Routing 和 Firestore 实现一个相当标准的博客应用程序 但我认为我误解了 props 在组件之间传递方式的基本部分 我的初始代码基于 Fireship io 上的优秀教程 该教程按
  • git amend 后的 git 合并冲突 - “你的分支和‘origin/master’已经分歧”

    发生的情况是这样的 最近提交到远程主控之后 我对本地存储库做了一个小小的更改 I add git commit amend并留下与 HEAD 相同的提交消息 我尝试将回购推向mastergit push 现在我明白了 On branch m
  • 如何在不使用VerifyExtraction的情况下将MSSQLServer数据库提取为.dacpac?

    我想使用 Server Management Studio 提取 MSSQLServer 数据库的数据库架构 我使用提取命令 提取数据层应用程序 数据库中有对另一个数据库的多个引用 因此 我收到以下错误 提取数据库时出错 数据包架构模型验证
  • 如何从小型、可重用的查询组成实体框架查询?

    我的应用程序中有一些 相当多余的 查询 如下所示 var last30Days DateTime Today AddDays 30 from b in Building let issueSeverity from u in Users w
  • Android Hello-World 编译错误:Intellij 找不到 aapt

    我正在尝试在 Ubuntu 12 04 中使用 IntelliJ 设置 Android 开发环境 我创建了一个 Android 应用程序模块 但是当我尝试构建时 出现以下错误 android apt compiler 无法运行程序 home
  • 为什么我的相机预览显示水平而不是垂直?

    在我的 Android 相机应用程序中 如果我将屏幕固定为横向 那么在横向模式下 它似乎必须被看到 但如果我将其固定为肖像 则相机预览将显示为水平方向 为什么会发生这种情况 以及解决方案是什么 Camera Parameters param
  • 正确使用封装在类内属性中的字段

    我应该使用哪种场景来更改类方法 属性内的私有字段 public class Example private int intVar 0 private string stringVar string Empty public int IntV