类什么时候应该使用自己的 getter/setter,而不是直接访问成员?

问题描述 投票:0回答:7

在 Eclipse 中生成 setter 和 getter 时,选项之一是在类中使用 getter 和 setter,而不是直接访问类成员。这种级别的类内部封装有用吗?还是说这个想法太过分了?

oop encapsulation
7个回答
11
投票

如果您希望发生潜在的副作用 - 验证、日志记录等,我认为这是一个好主意。(在 C# 中,我希望能够声明一个变量和属性,并表示“仅”访问该变量是通过酒店。) 有时,您可能会发现您需要直接精确地设置变量,因为您

想要副作用。例如,您可能需要一起设置两个变量,并且“之前”和“之后”状态都有效,但是单独设置任一属性都会导致验证失败。


3
投票

在我看来,这是需要在编码指南中定义的内容。


3
投票

Eric Lippert 有一篇关于

自动与显式属性

的优秀文章,尽管角度略有不同,但处理了这个问题。 本质上,您需要问的问题是:

“从类内部访问此属性所需的语义与从外部访问该属性的所需语义不同吗?”

如果语义相同,您的类应该使用自己的属性。如果语义不同,您的类将需要直接操作支持字段。


0
投票

对于吸气剂,您可以在更改表示时计算一个值,而不是访问字段。


0
投票


0
投票

我发现拥有私有/内部属性在这些情况下确实有帮助。

但我当然不会为任何会员这样做。

最新的 .NET/VS 在这里确实很有帮助,因为您可以这样声明属性:

public string SomeProperty { get; set; }

并且它有效地创建了幕后成员。我知道这对您没有帮助,但我认为这可能会引起您的兴趣:-)


0
投票

这是代码:(使用 VS 2008 SP1 构建,针对 .net 3.5 - 我使用了 WPF 项目)。 WPF 项目中有 2 个项目,主窗口 (window1) 和我们正在测试的对象 (DataObject) 窗口上有一个标签,它与数据对象实例中的 Name 属性进行数据绑定。如果将 Name 属性转换为字段(删除 getter/setter),数据绑定将停止工作。

Window1.xaml:

<Window x:Class="WpfDatabinding.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <Grid> <Label Name ="Label1" Height="28" Margin="12,24,37,0" VerticalAlignment="Top" Content="{Binding Name}"></Label> </Grid>



Window1.xaml.cs

using System; using System.Windows; namespace WpfDatabinding { /// <summary> /// Interaction logic for Window1.xaml /// </summary> public partial class Window1 : Window { private DataObject ADataObject; public Window1() { InitializeComponent(); this.ADataObject = new DataObject(); this.ADataObject.Name = "Hello!"; this.DataContext = this.ADataObject; } } } namespace WpfDatabinding { /// <summary> /// Interaction logic for Window1.xaml /// </summary> public partial class Window1 : Window { private DataObject ADataObject; public Window1() { InitializeComponent(); this.ADataObject = new DataObject(); this.ADataObject.Name = "Hello!"; this.DataContext = this.ADataObject; } } }

DataObject.cs:

namespace WpfDatabinding { public class DataObject { // convert this to a field, and databinding will stop working public string Name { get; set; } } }

© www.soinside.com 2019 - 2024. All rights reserved.