【问题标题】:Properties or methods or both? [closed]属性或方法或两者兼而有之? [关闭]
【发布时间】:2013-04-17 16:03:45
【问题描述】:

在 .NET 库和许多第三方库中,我可以看到如何更改内部(私有)成员值有一些约定,它们支持属性(.NET 属性)或方法(这些通常是在 java 中作为 Setter 和 Getter 使用)或两者都用于程序员。

我想知道何时(以及为什么)使用属性、方法或两者兼而有之。例如,可以使用 Visible 属性(在 Windows 窗体中)或调用方法 Show()Hide() 来更改控件的可见性强>。有一些值(我知道有一些内部/私有值)只能通过调用方法(如 setter)来更改。在设计自己的控件、类时,我有点犹豫是选择属性还是方法(或者两者都支持?),事实上,选择其中一个也可以(Java 是一个仅使用方法的示例)。我知道属性相对于方法(如 getter 和 setter)的优势,但如果是这样,为什么我们必须在某些情况下使用方法,它们会呈现给程序员甚至替换属性。我对此有点困惑,对我来说(正如我所说),只使用方法时我感觉还可以(就像我在 java 中所做的那样,这还不错:)。

我想知道您的经验以及您在这方面的惯例。我喜欢遵循编程中的标准约定(针对每种编程环境和每种语言)来区分它们。不像一些发明自己的风格的人,这些风格对其他程序员来说有点难以辨认,例如在 C# 中使用 C++ 命名约定(甚至是 PHP 命名约定?)?对我来说有点奇怪,对不起。

请分享,谢谢...

【问题讨论】:

  • 如果公共属性和类实现 iNotifyPropertyChanged,则 UI 会动态更新。投票结束。 msdn上有很多关于这个的。
  • @Blam,你说的是 UI 吗? UI 只是众多案例中的一种,有大量的类,尤其是在开源和第三方库的世界中,它们与 UI 无关并且似乎不遵循任何约定。他们甚至使用方法而不是属性。
  • 那么你的意思是什么?是的,您会发现很多不使用约定的代码。您的问题被标记为 .NET,您询问了何时以及为什么。我举了一个例子,说明何时以及为什么要使用属性。

标签: c# .net coding-style


【解决方案1】:

我知道属性相对于方法(作为 getter 和 setter)的优势,但如果是这样,为什么我们必须在某些情况下使用方法,它们会呈现给程序员甚至替换属性。

一般来说,使用类时,期望属性会“快速”且没有副作用。另一方面,一种方法表明“某事”即将发生。

在选择是否基于属性或方法公开 API 时,我会尝试查看值/方法/等代表什么。如果它是一个,并且可以直接返回(或非常快速地获取而几乎没有副作用),那么属性更有意义。如果是操作,那么方法更有意义。

【讨论】:

  • 嗯,是的,一个操作真的很容易实现,如果它是为了做除了“设置/更改一些私有值”之外的其他事情,正如我所说,我只关注 setter 方法而不是一般方法. setter方法的操作其实就是改变一些值,可以通过property来实现。
  • @KingKing 是的,我的意思是,如果存在长期运行的副作用(发生某些操作)等,那么一种方法可以更清楚地说明这一点。
  • 好的,看起来我应该尝试更多地了解副作用。谢谢。
【解决方案2】:

以您为例:将 Visible 属性设置为 false 不会立即隐藏控件——该属性不包含任何代码或调用任何隐藏控件的代码;相反,它会更改控件的状态,以便稍后将其隐藏(通过其他代码)。相反,Hide 方法会立即隐藏控件; Hide 方法包含实际隐藏控件的代码或调用代码。

将 Visible 设置为 false 可能会隐藏控件(几乎立即),但这是因为有其他代码正在运行,它检测到对象的状态已更改(Visible 属性已更改)并通过实际制作控件来立即响应无形的。

我在这里说的是一般意义上的,没有参考任何实际的代码库;完全可以编写一个 Visible 属性,因此它实际上隐藏了控件,但这打破了属性没有副作用的通常约定。

因此,属性会改变对象的状态,而方法实际上会做一些事情(可能会也可能不会改变对象的状态)。

【讨论】:

  • 太好了,感谢您的好回答,但是对于 Visible 属性,正如我所经历的那样,控件在 Visible 设置为 false 后立即隐藏。其实我在知道/使用 Hide/Show 方法之前已经使用 Visible 很长时间了,现在我仍然比 Hide/Show 方法更频繁地使用 Visible 并且一切正常(效果立即反映而不是简单地改变状态)?
猜你喜欢
  • 2021-01-01
  • 2011-06-17
  • 2015-10-14
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2018-12-01
  • 2020-02-04
相关资源
最近更新 更多