使用自动实现的属性或自己实现该属性

2023-12-09

在 C# 中,我们可以创建一个自动实现的属性,如下所示

public string MyValue{get;set;}

然而,我们也可以像这样自己创建一个属性

private string _myValue;
public string MyValue
{
    get { retrun _myValue; }
    set { _myValue = value; }
}

我的问题是,在什么情况下我们应该使用自动一,什么情况下我们应该自己实现?


至少在一种明显的情况下,您不应使用自动实现的属性:两个不同 DLL 之间的任何类型的二进制序列化。

二进制序列化依赖于私有成员,并且自动实现属性的私有支持成员不能保证在每个编译的 DLL 中都相同,因此二进制序列化可能会严重失败。

不使用自动实现的属性的另一个原因是,您将失去对将支持字段指定为 NonSerialized 的能力的控制,但在这种情况下,为属性创建支持字段很容易。

如果您或您使用的任何产品对成员(即 WCF)执行反射,那么您将看到损坏的支持字段名称,而不是您创建的“漂亮”支持字段。

如果您之前提供了对服务的访问权限,或者您在接收端反序列化为相同的类结构(即,WCF 管道的两端使用相同的类),那么这一点可能非常重要。在这种情况下,您不一定能够反序列化,因为您可以保证支持字段名称相同,除非您共享相同的 DLL 而不是源代码。

例如,假设您有一项服务通过 WCF 将某些业务对象公开给您创建的 silverlight 客户端。为了重用您的业务逻辑,您的 Silverlight 客户端添加对业务对象源代码的引用。如果您有自动实现的属性,则您无法控制支持字段名称。由于 WCF 序列化的是成员而不是属性,因此您无法确定从 WCF 服务传输到 silverlight 的对象是否会正确反序列化,因为支持字段名称几乎肯定会不匹配。

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

使用自动实现的属性或自己实现该属性 的相关文章

随机推荐

  • 如何使用 apt 安装指定版本的 Ruby

    我尝试安装指定版本 2 5 1 的 Ruby 该版本只是示例 并尝试执行以下脚本 但出现如下错误 是否可以使用 apt 安装来安装 Ruby 版本 以便我可以处理 Ruby 版本依赖性问题 sudo apt update sudo apt
  • rxjava:我可以使用 retry() 但有延迟吗?

    我在 Android 应用程序中使用 rxjava 来异步处理网络请求 现在我想仅在经过一定时间后重试失败的网络请求 有没有办法在 Observable 上使用 retry 但仅在一定延迟后重试 有没有办法让 Observable 知道当前
  • 为什么我收到“没有为复数定义排序关系”错误?

    See 这个问题一些背景 我在该问题上的主要问题已解决 建议我向另一个问题询问我遇到的第二个问题 print cubic 1 2 3 4 Correct solution about 1 65 if x gt 0 TypeError no
  • 如何在 django 模板中迭代查询集列表

    有没有办法在模板中迭代这个查询集列表
  • 解析 Prolog 中的表达式并返回抽象语法

    我必须编写 parse Tkns T 它接受标记列表形式的数学表达式并找到 T 并返回表示抽象语法的语句 尊重操作顺序和关联性 例如 parse num 3 plus num 2 star num 1 T T add integer 3 m
  • javascript - 在 html 中使用函数调用 - 坏还是好?

    使用 Angular 会带来很多奇怪的代码风格 比如我一直以为这个
  • 使用 PHP 和 Apache 路由 URL 路径

    我正在尝试为我的网站创建一个漂亮的网址结构 我的路由器类仅在 url 的样式为 something value 时才起作用 我如何得到它 它的工作方式如下 something value 在我的 htaccess 中我有 Options F
  • 修改默认的 HTML5 视频控件

    我有一个相当不寻常的问题要问你们 这可能很愚蠢 但我是这个领域的新手 我真的很感激一些帮助 正如标题所示 我想知道是否有一种方法可以禁用默认浏览器控件中的特定按钮HTML5 video 我知道每个浏览器都有自己独特的一组控件 所以我认为我不
  • 有没有办法在 TextStream 文件中向后导航?

    我已经开始使用 fso 对象来克服 VBA 的 2GB 限制 一切看起来都符合我的目的 只是我找不到路要走向后在文本流文件中 为了继续前进 我使用了读取 字符数 和跳过 字符数 有办法这样做吗 我遇到了同样令人沮丧的限制 这是一个包装本机
  • 无法加载文件或程序集 HRESULT:0x80131515(将控制器添加到网络驱动器上具有程序集引用的 MVC 项目时)

    我见过这个 VSTS 2010 SGEN 错误 无法加载文件或程序集 HRESULT 异常 0x80131515 并且所有答案都不起作用 当我构建或执行任何操作时它也不会出现 我可以正常运行该项目 当我尝试添加实体框架模板化控制器时会发生这
  • 如何创建一个防止新头出现的水银钩?

    我有几个从 SVN 转换而来的存储库 并且我们希望确保当人们推送到存储库时他们无法创建额外的头 里面有几个钩子提示和技巧 wiki 页面如果有多个头 则可以防止推动 但是我如何构建一个防止推动的钩子new heads 似乎正确的方法是比较修
  • 如何为 Kubernetes 中托管的多个应用程序选择 Kafka 事务 ID?

    我有一个经典的微服务架构 所以 有不同的应用 每个应用程序可能有1 N实例 该系统部署到Kubernetes 所以 我们有很多不同PODs 可以随时启动和停止 我想实施读 处理 写模式 所以我需要 Kafka 事务 要配置交易 我需要设置一
  • 我在哪里对我的密码进行加盐和哈希处理?在客户端还是在主机?

    我认为直接在客户端计算机上对密码进行加盐和哈希处理会更明智 原因是 我实际上从来不想获取用户的密码 这个字符串应该对他保密 而不是对我们俩保密 现在有人争论说 你想对盐保密 所以你不能通过通道以明文形式发送它 显然 事实并非如此 所以现在我
  • 如何将行号投影到 Linq 查询结果中

    如何将行号投影到 linq 查询结果集上 而不是说 字段 1 字段 2 字段 3 字段 1 字段 2 字段 3 我想 1 字段1 字段2 字段3 2 字段1 字段2 字段3 这是我的尝试 public List
  • 如何在 Customer.create 之后解析 Stripe JSON 响应?

    我读过使用此版本 Stripe API 的其他线程 但实际解析嵌套 JSON 的问题从未得到解答 例如 创建信用卡后如何解析 Stripe JSON 响应 或标记为重复 例如 如何读取 stripe webhook 响应 通过 重复的起源
  • 事件句柄和可见

    好的 我正在为我的班级做一个项目 我必须将所有内容都放在一页上 并在顶部有一个菜单 菜单中应该有新建 打开 来自 Html 保存和退出 我已经完成了除了 From HTML 之外的所有操作 我有点困惑 当用户单击 来自 HTML 时 需要将
  • java和python之间传递数据

    如果我的问题很菜鸟 我很抱歉 我正在运行 Django 1 2 和 pgsql 8 4 我需要在获取用户的输入后运行 Java 程序 进行一些计算并将结果返回给用户 我可以知道在 Java 和 Python Django 之间传递数据的最佳
  • 如何通过 ingress 将服务暴露给外部 Kubernetes 集群?

    我正在努力将 AWS 集群中的服务公开给外部并通过浏览器访问它 自从我的上一个问题还没有得出任何答案 我决定从几个方面简化问题 首先 我创建了一个无需任何配置即可运行的部署 基于本文 I did kubectl create namespa
  • 将字符串值聚合到列表中

    我正在尝试使用一些非常简单的逻辑将未旋转的列转换为本质上相当于分组列表的内容 然而 在有效地做到这一点上遇到了困难 本质上 我有一个数据集 如下所示 CUST ID ORDER 1 Cake 1 Bread 2 Cake 3 Cake 3
  • 使用自动实现的属性或自己实现该属性

    在 C 中 我们可以创建一个自动实现的属性 如下所示 public string MyValue get set 然而 我们也可以像这样自己创建一个属性 private string myValue public string MyValu