关于c#的点(.)运算符

本文关键字:运算符 的点 关于 | 更新日期: 2023-09-27 18:14:03

很抱歉上一个帖子…这是另一个

到目前为止,似乎人们使用(.)操作符来:

(1)结构

的访问成员

(2)访问类的static/constant成员

(3)枚举类型

的访问字面值

(例如dayofweek.cs http://referencesource.microsoft.com/#mscorlib/system/dayofweek.cs)

而没有该结构体/类/enum的对象/实例

我知道操作符的含义可以取决于它的操作数;

但是其中一些对我来说看起来有点奇怪。

例如(3):

在c#中,我可以写: DayOfWeek a; if (a == DayOfWeek.Sunday) *do something...*;

,但在C中,我只能写: DayOfWeek a; if (a == Sunday) *do something...* .

另一个例子,在(1)的情况下:

在C语言中,只有在有了结构体的实例之后,才能对其成员进行操作;

但是在c#中,就像在https://stackoverflow.com/questions/24888864/two-things-about-source-code-of-struct-datatime-in-c-sharp中一样,我们可以直接使用NAME(即, DataTime),以访问其成员(即。, Maxticks),即DataTime.Maxticks

显然是有区别的,对吧?

我在哪里可以读到这个操作的详细教程或文档,告诉我如何使用这个操作?只有语言规范?

**实际上我不喜欢通过一个接一个地看例子来学习这个操作,因为他们没有告诉我"如何使用它",而只是"我能用它做什么";

关于c#的点(.)运算符

您已经注意到,.操作符是用来访问成员的。

如果该成员被标记为static,那么您可以通过类名引用它,因为只有一个类的静态"实例"(并且由运行时实例化)。这就是你看到的DateTime.MaxTicks

枚举不是static,但其成员的访问方式相同,因为需要用枚举名限定成员名。来自c#规范(v5.0,第14.3节):

在所有其他代码中,枚举成员的名称必须用枚举类型的名称。枚举成员没有任何声明可访问性—如果枚举成员包含枚举类型,则该成员是可访问的访问.

.的一个用途是限定某些东西(比如当您显式声明一个类来自哪个命名空间时)。

基本上,只要你想访问某个对象的成员,就使用.。只要知道它是实例还是静态变量,就可以知道是否需要该类型的实例,或者是否可以只使用类名。.也可用于限定某物的名称,在为类指定名称空间或使用enum时使用。

在C语言中,只有当我们有一个结构体的实例之后,我们才能做对其成员的操作;

,但在c#中,就像在结构的源代码的两件事在c#中,我们可以直接使用NAME(即。, DataTime)结构来访问其成员(即, Maxticks),即DataTime.Maxticks

显然是有区别的,对吧?

当类的方法是static方法时,可以使用类的名称,然后使用点和要调用的方法。在这种情况下,方法属于类,而不属于使用new关键字创建的对象。

来自c#规范:

方法是实现下列计算或操作的成员由对象或类执行。访问静态方法通过课堂。的实例来访问实例方法类。

关于static关键字的一个最好的解释可以在MSDN中找到。

对于c#中struct的成员的访问,使用与c#中访问class成员相同的操作符,点操作符。这就是为什么需要DayOfWeek.Sunday的原因。

可以把它看作是对名称空间的导航。您的项目结构可以是:

  • MyApp
    • 形式
      • MainForm
        • ShowForm ()
        • IsOpen ()
      • SomeClass
        • SomeStaticMethod ()
        • NonStaticMethod ()
      • OtherClass
        • SomeEnum
          • EnumValueOne
          • EnumValueTwo
    • 存储库
      • ThisRepo

尽管它们的目的和结构不同,但所有这些都可以使用点表示法以类似的方式调用、导入或访问。在MainForm上调用静态的ShowForm() void将是MyApp.Forms.MainForm.ShowForm(),就像在OtherClass中引用enum将像MyApp.Classes.OtherClass.SomeEnum.EnumValueTwo一样。

在向类添加using语句时,显然不需要执行完整的限定名称空间,但希望这显示了概念。