C# VB.NET中的类字段可以在没有Getter&;塞特?

C# VB.NET中的类字段可以在没有Getter&;塞特?,c#,vb.net,oop,properties,getter-setter,C#,Vb.net,Oop,Properties,Getter Setter,在VB.NET中,我注意到我可以通过使用property关键字后跟property name和datatype直接创建属性,而不需要getter和setter方法,而在C#中我无法做到这一点 然而,这个属性似乎被封装起来,就好像我把它放在了getter和setter方法中一样 请看下面的截图 在上面的屏幕截图中,我谈论的属性是number1,我创建了另一个封装在getter和setter方法中的属性,名为number2 然后,我在Class2中创建了Class1的一个新实例,但是我注意到num

在VB.NET中,我注意到我可以通过使用property关键字后跟property name和datatype直接创建属性,而不需要getter和setter方法,而在C#中我无法做到这一点

然而,这个属性似乎被封装起来,就好像我把它放在了getter和setter方法中一样

请看下面的截图

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

然后,我在Class2中创建了Class1的一个新实例,但是我注意到number1属性在我创建了它的类的实例之前是不会公开的,就像它被封装在一个getter和setter方法中一样,比如number2属性

有什么解释吗?

这被称为“自动属性”,在以下文件中有非常明确的定义:

都是具有getter和setter(以及自动创建的备份字段)的自动属性

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

public int MyProperty => 10;
相当于

public int MyProperty { get { return 10; } }
但我注意到,在我找到之前,number1属性是不会暴露的 创建了其类的实例,该实例与 封装在一个getter和setter方法中,比如number2属性

在创建类的实例(不是方法、字段或属性)之前,不会公开任何内容!这与getter/setter或属性无关。。。只是你的基本OOP


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

VB.Net是否与c#的
public int Number=>Number
()?@IvanGarcíAtopet是我所不知道的,或者我找不到的。目前还没有类似的。更新版本的C#还允许在getter和setter中使用表情体成员。谢谢Ron,你知道我想要什么!你提到的那篇文章正是我想要的。@RonBeyer,你知道如何在C#中访问类中的backing字段吗?在VB中,我可以使用下划线_MyProperty访问它。它甚至创建了一个前缀为u的隐藏变量“我注意到number1属性在我创建了它的类的实例之前是不会公开的”-您能详细说明一下这是什么意思吗?在创建其父类的实例之前,不会公开任何成员(属性、字段、方法或其他),除非您将其标记为。感谢您的澄清,我曾经认为Getter和Setter的作用是在创建一个类的实例之前隐藏一个类字段,使其不会暴露给应用程序的其他部分。感谢您的澄清,但是Getter和Setter的好处是什么?在我们创建它的类的实例之前,什么都不能暴露?这是隐藏字段名并用属性名替换它的想法吗?只有在我们创建类实例以代表字段本身时才能公开属性名?@Haythamairah:所有属性都有getter和setter。如果您不自己编写,编译器将为您生成它们。它们基本上是标准方法(getter相当于
函数
,setter相当于
子函数
)。当您想在返回值之前或更改值之前或之后进行处理时,可以编写自己的getter和setter。这里有一个例子:@Haythamairah:我认为你误解了房产的用途。。。属性的存在可以帮助您控制从类/结构传递到类/结构的数据。getter和setter在那里,这样您就可以对类接收/发出的数据施加限制,或者在值更改时帮助您做出反应。例如,当您通过
PictureBox.image
属性更改
PictureBox
的图像时,setter中的代码不仅更新支持字段,而且还调用
Invalidate()
这将强制
图片盒
重新绘制以显示新图像。@VisualEvent:非常感谢您的解释,它非常有用!
public int MyProperty { get { return 10; } }