C# 中的“字段”和“属性”有什么区别? [复制]

2023-12-20

编辑,根据这些评论:

你指的是“财产”还是“土地”? 公共字符串S1;与公共字符串 S2 { 得到;放; } –dana https://stackoverflow.com/users/315689/dana

完全是布施,我的意思是一样的。 –Asad https://stackoverflow.com/users/411425/asad

阿萨德:你真的需要尝试使用 其他一些术语来描述你的事情 意思是为了让我们更好地理解 你的问题。 C#没有全局 变量。您可以定义的字段 在 C# 中不是全局的 - 它们是 类类型的成员。 –dthorpe https://stackoverflow.com/users/301152/dthorpe

嗨,伙计们,

需要您的专家意见来了解两者之间的差异Field and Property。正如在我的项目中一样,我使用了某些全局变量,后来我将其更改为“属性”。我的经理问使用它有什么好处Properties变量而不是Fields.

虽然我已经回复他了Property提供一种安全/安全/间接访问Field如果声明了它们,而不是直接修改它们public or protected。但请给我一些更有说服力的论据。

感谢致敬

@阿萨德: 你应该正确理解你的术语:Fields不是Global Variables,C#没有全局变量(正如一些评论者提到的:你可以模拟全局变量,但你不应该这样做)。


主要优点是您可以将各种功能附加到属性,例如验证、同步等。您不能对类字段执行此操作。例如,字段可以在赋值时引发 BCL 异常,但它不能引发对问题域中的逻辑有意义的异常。

还想象一下尝试保护线程同步的字段。您必须在代码中访问该字段的所有位置编写额外的代码。要对属性执行此操作,您只需用锁将 getter 和 setter 包装在一个地方即可。 (但是要注意!如果您使用可变类型,那么在属性 getter 和 setter 中使用锁的便利性可能会给您一种错误的安全感。请参阅这篇文章中已接受的答案。 https://stackoverflow.com/questions/7161413/thread-safe-properties-in-c-sharp)

现在,您可能认为验证和同步对于这个特定值来说对您来说并不重要,而且对于这个特定实例来说它们可能永远都不重要。但是,通过使用属性而不是直接字段访问,可以使您的应用程序在未来更易于维护。 (假设整数字段的值突然需要来自与原始实现不同的源,并且需要从字符串转换为整数。如果您使用属性来包装字段,那么您可以在一处进行更改,并且使用该属性的所有客户端代码根本不需要更改!)

另外,为了管理跨多个类(全局)共享的信息,请查看单例模式 http://en.wikipedia.org/wiki/Singleton_pattern。但要小心!尽管它看起来整洁干净,但您仍然可能会遇到麻烦。虽然如果你really需要全局数据,您应该使用单例中包含的属性。如果不出意外的话,这是一个很好的组织策略。

为了避免单例或“全局”数据的问题,请查看依赖注入 http://www.dotnet-tricks.com/Tutorial/dependencyinjection/67LX120413-Implementation-of-Dependency-Injection-Pattern-in-C作为一个更好的选择。

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

C# 中的“字段”和“属性”有什么区别? [复制] 的相关文章

随机推荐