为什么更喜欢属性而不是公共变量? [复制]

2024-01-01

其他能够对 setter 中的值进行健全性检查是否有更根本的原因来选择属性而不是公共变量?


我们以前有过这个主题,但现在找不到任何内容。

简而言之:您的需求可能会发生变化:如果现在没有健全性检查,将来可能需要进行健全性检查。但是,如果您将公共字段更改为属性,则会破坏二进制兼容性:每个使用您的代码/库的客户端都必须重新编译。

This is bad因为它可能会花费很多钱。

从一开始就使用属性可以避免这个问题。这甚至对于不属于库的代码也很重要。为什么?因为你永远不知道:代码(即使是高度特定于领域的!)可能会被证明是有用的,所以你想将其重构为一个库。如果您已经使用属性来代替公共/受保护字段,那么这个重构过程显然会变得更加容易。

此外,在 C# 3.0 中编写公共属性很容易,因为您可以只使用自动实现的属性,从而节省大量代码:

public DataType MyProperty { get; set; }

将为您实现必要的支持字段和 getter/setter 代码。

我将添加一个个人注释:.NET 在这方面的行为有些懒惰。编译器可以即时将公共字段更改为属性,从而避免该问题。 VB6 已经对 COM 公开的类执行了此操作,而且我认为 VB.NET 和 C# 绝对没有理由不执行相同操作。也许编译器团队的某个人(Jared?)可以对此发表评论。

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

为什么更喜欢属性而不是公共变量? [复制] 的相关文章

  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • “%”(百分比)在 PowerShell 中起什么作用?

    操作似乎在管道之后启动脚本块 尽管about Script Blocks http technet microsoft com en us library hh847893 aspx表示 不是必需的 这些都工作得很好 get childit
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没
  • 当我使用 OpenSSL1.1.0g 根据固定的 p 和 g 值创建 Diffie Hellman 密钥协议密钥时,应该执行哪些检查?

    您好 我尝试通过这段代码使用修复 p 和 g 参数来制作 Diffie Hellman Keysanswer https stackoverflow com a 54538811 4706711 include

随机推荐

  • VS 2015 上的平台工具集更改

    我需要在 VS 2015 上进行一些汇编编码 为此我需要使用一个包含某些 C 函数的包含文件 该文件在 VS 2012 和 2013 上完美运行 但由于 VS 2015 上的一些库更改 据我所知 它在链接过程中出现错误 因此 建议我将平台工
  • Android 的 Html.escapeHtml 和 TextUtils.htmlEncode 之间有什么区别?我什么时候应该使用其中之一?

    Android 有两种不同的方法来转义 编码字符串中的 HTML 字符 实体 Html escapeHtml String http developer android com reference android text Html htm
  • 如何查看另一个 php 文件中定义的变量?

    我在所有 php 文件中使用相同的常量 我不想在我的所有文件中分配此变量的值 因此 我想创建一个 parameters php 文件并在那里进行分配 然后在所有其他文件中我include parameters php 并使用 paramet
  • Chrome 无法正确渲染 div 中的 span

    当跨度嵌套在具有不同背景的 div 中时 其上方和下方会出现一个小间隙 FF 不会这样渲染 这是html div style background color magenta span style background color cyan
  • IBM Worklight - 无法在 Dojo 应用程序中加载 index.html

    我已经使用 Dojo 库创建了示例 Wokrlight 项目 默认模板项目 Android 版本的应用程序在 Android 模拟器中运行良好 显示 index html 的内容 但是当我在设备中运行相同的应用程序时 它首先显示 IBM 启
  • List.AddRange() 线程安全吗?

    我可以在不锁定的情况下从多个线程安全地调用 List AddRange r 吗 如果不是的话 我会遇到什么样的麻烦呢 No 它的文档 http msdn microsoft com en us library 6sh2ey19 aspx没有
  • LNK1169 找到一个或多个多重定义的符号。我知道这可以被认为是重复的,但我找不到任何可以解决我的问题的东西[重复]

    这个问题在这里已经有答案了 我有一个老师需要的头文件 我正在使用全局变量 因此我可以将值从一个函数移动到另一个函数 查了一下问题 有人建议使用命名空间 那没有用 此外 我像其他人推荐的那样添加了一些守卫 但这也没有帮助 我有多个文件和标头中
  • IE8 标准不支持 array.map 函数?

    我没有 IE8 所以我正在从 IE10 中测试 IE8 当我切换到文档模式的 IE8 标准 时 数组对象的 javascript 映射函数给出 javascript 错误 对象不支持属性或方法 映射 但是当我切换到文档模式的 标准 时 没有
  • Java中的命令行查询

    我正在访问 MongoDB 并且希望在 Java 中重用典型的命令行查询 我知道可以使用 BasicDBObject 但我想使用如下命令行查询 db MyCollection find 我现在尝试使用数据库的 command 方法 Mong
  • 如何在新闻通讯中创建悬停效果?

    我正在创建一份时事通讯 并且我希望面板可以在鼠标悬停时更改背景颜色 鉴于时事通讯不会有标题 我正在内联定义所有样式 我很确定大多数流行的邮件客户端都会阻止 JS 所以我想知道是否可以在 style 属性中定义悬停效果 或者有没有其他方案可以
  • sed - 删除破折号之前的所有字符

    我有一个文件名列表 我想删除第一个实例之前的所有字符 因此 之前 列表中的以下名称将显示为 之后 列表中的名称 Before Adam James Welcome Home txt Mike Harry One Upon A Time tx
  • 将彩虹颜色映射到 RGB

    假设我有一个带构造函数的 RainbowColorsMapper 类RainbowColorsMapper int n 其中 n gt 2 现在我想要使用该方法获得从红色到紫色的彩虹颜色的连续映射mapper getColor int nu
  • C# 泛型及其具体实现

    是否可以在 C 中创建泛型方法并为给定类型添加具体实现 例如 void Foo
  • Ruby gem 是否存在像木马一样的风险?

    我正要安装一个我没听说过的人的 Ruby gem 但有些事情让我想到 这个人是谁 由于 gem 系统可以访问互联网 因此 Ruby gem 是否存在访问您计算机上的私有数据并将其传输到其他地方的风险 或者有针对这种情况的保护措施吗 当然有
  • 使用 cout 语句执行 while 循环

    所以我有一个关于do while环形 我正在学习 C 我知道你可以写这样的东西 do while a lt 10 cout lt lt message 关键是 我知道这在 C 中是可能的 但我们真的这样做了吗 我的意思是 cout thin
  • 如何解决 SQL0418N 错误

    我正在使用下面的语句来更新 插入一些数据到表中 如果我不带参数运行它 那就没问题 但是 一旦我尝试使用它抛出的参数执行它 SQL0418N 语句包含使用非类型化参数标记 DEFAULT 关键字或无效的空值 我已阅读错误信息here http
  • WebDeploy API (IIS 7) - “公共 API”:资源?

    有人知道 WebDeploy API 的任何资源吗 有人用过吗 我尝试在官方论坛上询问 并浏览了该网站 该网站说有 公共 API 但没有链接 文章 资源 博客文章或示例 http forums iis net t 1180561 aspx
  • 单击事件不适用于动态添加的 Li->span->id

    单击事件不适用于动态添加的 Li gt span gt id case 101 strLink li a span Form 101 span a li sidebar nav append strLink break sidebar na
  • 如何将文件夹标记为包?

    我曾经认为文件夹需要有扩展名 以便 Finder 将它们识别为包 该扩展将在所属应用程序的 Info plist 中声明 显然还有另一种更优雅的方式 但我不知道它是如何完成的 例如 iPhoto 图库被 Finder 视为一个包 但它没有扩
  • 为什么更喜欢属性而不是公共变量? [复制]

    这个问题在这里已经有答案了 其他能够对 setter 中的值进行健全性检查是否有更根本的原因来选择属性而不是公共变量 我们以前有过这个主题 但现在找不到任何内容 简而言之 您的需求可能会发生变化 如果现在没有健全性检查 将来可能需要进行健全