【问题标题】:Is it safe to replace a field with a auto property? [closed]用自动属性替换字段是否安全? [关闭]
【发布时间】:2019-06-21 00:51:26
【问题描述】:

如果一个类(或结构)有一个字段,而我们用相同类型的自动属性替换它,考虑到我们不使用反射或任何其他类型的直接或间接元编程?例如

int Integer;

public void Test() {
  Console.WriteLine(Integer);
}

如果我将int Integer 更改为int Integer { get; set; },使用它的代码将保持不变。有什么情况需要更改调用代码吗?

关于只读字段和仅获取属性的相同问题。

编辑:我澄清了我的问题。此外,考虑到现有答案,而不是自动属性,问题将是关于 ref 属性:

这个可以换吗

int Integer;

int _integer;
ref int Integer => ref _integer

调用代码没有任何变化?

【问题讨论】:

  • 您不能将属性传递为ref
  • @SLaks:是的。我忘了这件事。虽然,从 c# 7 开始,您可以将 ref 属性作为 ref 传递,但情况会有所不同
  • 这里的问题很简单,我的意思是Comparing class or structure fields and auto properties (or readonly fields and get-only auto properties)我们在比较什么?它们都在一起,类与结构,字段与属性,你可以用它们做什么,以上所有?您是否正在寻找编译时间约束、运行时约束?我感觉这个问题是“我应该使用结构还是类”但是很难说出你真正想要什么信息
  • @TheGeneral:如果我用属性或相反的字段替换字段,我想找到一个需要更改客户端源代码的案例。我想知道这个替代品有多安全。

标签: c# properties ref c#-7.0


【解决方案1】:

如果我需要更改客户端源代码,我想找到一个案例 将字段替换为属性或相反。我想知道有多安全 这个替换是

Fields (C# Programming Guide)

通常,您应该只将字段用于具有私有属性的变量 或受保护的可访问性。您的课程向客户公开的数据 代码应通过方法、属性和索引器提供。经过 使用这些结构间接访问内部字段,您可以 防止无效的输入值。一个私有字段,存储 公共属性公开的数据称为后备存储或后备 字段。

所以你有关于字段和属性使用的官方说法

我的意思是,如果我们将一个字段替换为 auto 属性或相反,我们会 在某些情况下需要更改客户端代码

是的,你可能会在以下情况下破坏东西,

  1. 如果您要公开 ref 传递的字段

  2. 如果此类正在被继承,并且在字段或属性被重新实现或覆盖的情况下

  3. 派生类实现需要属性等的接口。

  4. 还有可能在表达式中使用它们并且它需要字段或属性(我认为)。

简而言之,如果大型代码库依赖于字段/属性,而您对其进行更改,则可能会导致上述任何内容的易碎更改。

虽然总而言之,如果您遵循上述 Microsoft 建议,您应该不会遇到什么问题,如果您这样做,则表明无论如何这可能应该被重构为一个新版本(带有可破坏的更改,等等预期用途)。

【讨论】:

  • 那么,除了第一种情况(C# 7 中已经介绍过)和最后一种情况更像反射之外,至少从字段更改为属性是安全的吗?
  • @AlexButenko 取决于代码库有多大,如果你的类是密封的或不太可能被覆盖,那么你可能会更安全,如果你的字段不太可能用于表达或反射则更安全。就第一点而言,它仍然会在 C#7 中收支平衡,尽管这将是一个非常微不足道的修复。在您的情况下,无论如何我都会这样做,很少应该公开字段
  • 这与现有代码库无关,它是理论问题。我正在编写一个工具,出于某种目的,它可能会用属性(或引用属性)替换字段。所以我在想代码是否仍然会以完全相同的方式运行(如果没有反射)。如果在任何情况下它的行为不同或不起作用,那么这不是一个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 2012-08-01
  • 1970-01-01
  • 2011-07-02
  • 2010-09-05
  • 1970-01-01
相关资源
最近更新 更多