【问题标题】:Class Fields in VB.NET can be encapsulated without the Getter & Setter?VB.NET 中的类字段可以不用Getter & Setter 封装吗?
【发布时间】:2019-01-30 00:08:10
【问题描述】:

在 VB.NET 中,我注意到我可以通过使用 Property 关键字后跟属性名称和数据类型直接创建属性,而无需 getter 和 setter 方法,而我不能这样做C#!

尽管如此,这个属性似乎被封装了,就好像我把它放在了一个 getter 和 setter 方法中一样!

请看下面的截图。

在上面的屏幕截图中,我所说的属性是 number1,我创建了另一个属性,封装在名为 number2 的 getter 和 setter 方法中。

然后,我在 Class2 中创建了 Class1 的新实例,但我注意到 number1 属性直到我创建了它的类的实例后才公开就像它被封装在像 number2 属性这样的 getter 和 setter 方法中一样!

有什么解释吗?

【问题讨论】:

  • 它甚至创建了一个带有前缀_的隐藏变量
  • “我注意到 number1 属性直到我创建了它的类的实例后才公开” - 你能详细说明你的意思吗?在您创建其父类的实例之前,不会公开任何成员(属性、字段、方法或其他)除非您将它们标记为Shared
  • 感谢您的澄清,我以前认为 Getter & Setter 的作用是在创建其类的实例之前隐藏类字段,以免暴露给应用程序的其余部分。跨度>

标签: c# vb.net oop properties getter-setter


【解决方案1】:

这被称为“自动属性”,在VB.NET documentation 中有非常明确的定义:

Public Property Name As String
Public Property Owner As String = "DefaultName"
Public Property Items As New List(Of String) From {"M", "T", "W"}
Public Property ID As New Guid()

都是带有 getter 和 setter 的自动属性(以及自动创建的支持字段)。

C# 要求您使用 {get; set;} 但基本相同(因为 C# 没有 Property 关键字,它需要一些东西来区分字段和属性,所以 {get; set;} 做到了)。 C# 有点不同,因为您可以在没有 {get; set;}... 的情况下定义 getter-only 属性...

public int MyProperty => 10;

相当于

public int MyProperty { get { return 10; } }

【讨论】:

  • VB.Net 是否有相当于 C# 的 public int Number => number (Read-only expression body properties)?
  • @IvanGarcíaTopete 我不知道或找不到。
  • 仍然没有这样的expression-bodied members in VB.NET。此外,较新版本的 C# 允许 getter 和 setter 中的表达式主体成员。
  • 谢谢你,罗恩,你知道我想要什么!你提到的那篇文章正是我要找的。​​span>
  • @RonBeyer,你知道如何在 C# 中访问类中的支持字段吗?在 VB 中,我可以使用下划线 _MyProperty 访问它。
【解决方案2】:

但我注意到 number1 属性直到我 创建了它的类的一个实例,就好像它是一样的 像 number2 属性一样封装在 getter 和 setter 方法中!

在创建类的实例之前没有任何东西被暴露(不是方法、字段或属性)!这与 getter/setter 或属性无关...只是您的基本 OOP

唯一的例外是带有“shared”关键字(c# 中的“static”)的方法/字段/属性

【讨论】:

  • 感谢您的澄清,但是在我们创建其类的实例之前,什么都不能暴露,但 getter 和 setter 有什么好处?是不是隐藏了字段名并用一个属性名替换它,只有当我们创建一个类的实例来代表字段本身时才能公开?
  • @HaythamAmirah:getter 和 setter 适用于所有属性。如果您不自己编写它们,编译器将为您生成它们。它们基本上是标准方法(getter 相当于 Function,setter 相当于 Sub)。当您想在返回值之前或更改值之前或之后进行处理时,您可以编写自己的 getter 和 setter。这是一个例子:pastebin.com/uTtznXX2
  • @HaythamAmirah :我认为您误解了属性的用途......属性的存在是为了帮助您控制从类/结构传递和传递给哪些数据。 getter 和 setter 在那里,以便您可以对您的类接收/发出的数据施加限制,以帮助您在值更改时做出反应。例如,当您通过PictureBox.Image 属性更改PictureBox 的图像时,setter 中的代码不仅 会更新支持字段,而且还会调用Invalidate(),从而强制@987654327 @ 重绘自身以显示新图像。
  • @VisualVincent:非常感谢你的解释,真的很有帮助!
猜你喜欢
  • 2021-06-05
  • 2018-05-05
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 2021-01-14
  • 2016-09-02
相关资源
最近更新 更多