【问题标题】:About the dot (.) operator of c#关于c#的点(.)运算符
【发布时间】:2014-07-22 15:21:54
【问题描述】:

对上一篇文章感到抱歉……这是另一篇文章。

到目前为止,我似乎有人使用 (.) 运算符来:

(1) 结构的访问成员

(2) 访问类的静态/常量成员

(3) 枚举类型的访问字面量

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

没有该结构/类/枚举的对象/实例

我知道一个运算符的含义可能取决于它的操作数;

但其中一些在我看来有点奇怪。

例如,(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 中一样,我们可以直接使用结构的名称(即DataTime)来访问其成员(即Maxticks),即DataTime.Maxticks

显然有一些不同,对吧?

在哪里可以阅读此操作的详细教程或文档,说明如何使用此操作?只有语言规范?

**我实际上并不欣赏通过逐个查看使用此操作的示例来学习的方式,因为它们不会告诉我“如何使用它”,而只是“我可以做什么”它”;不过,这两个是不同的。

【问题讨论】:

  • 阅读静态关键字。
  • 我建议你阅读Help部分What topics can I ask about here?
  • 一切都与范围有关... [instanceName].[instanceMember], [ClassName].[StaticMember], [EnumName].[EnumMember], this.[CurrentInstanceMember] - 左侧定义范围,.基本上总是意味着“在左侧范围内”,然后右侧是您尝试访问的范围的哪一部分。

标签: c# struct static enums static-methods


【解决方案1】:

如您所见,. 运算符用于访问成员。

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

枚举不是static,但其成员的访问方式相同,因为您需要使用枚举名称限定成员名称。来自 C# 规范(v 5.0,第 14.3 节):

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

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

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

【讨论】:

  • “枚举不是static,但其成员的访问方式相同”这就是我的问题所在......在哪里可以找到这条规则?????
  • @J.C.添加了一些关于“。”的内容。用于名称限定的运算符,以及说明这一点的规范的相关部分是枚举所必需的。希望对您有所帮助!
  • 再次感谢您!!在我发表评论后,我查看了进行枚举变量赋值的示例,并读到这种限定是必要的。我也尝试在 C 中生成相同的情况,但失败了; C 不允许这种情况(即,为不同的枚举成员赋予相同的名称),而 C# 允许。尽管如此,似乎在 C# 中这个资格(在枚举成员访问中)是必要的,即使不是在这种情况下,这里可能是语言设计的一种权衡!
  • @J.C.我不会假装理解语言设计者,但我喜欢明确地说出我的价值来自哪个枚举。它使代码在其所做的事情上更加明确并且更易于阅读。无论如何,我很高兴能够帮助您理解!
  • 感谢您始终如一的反馈 Bradley.NET!只是我忘了点击那个标记。无论如何,我认为多练习阅读语言规范并以正确的方式查找内容对我来说应该是重要和有帮助的。
【解决方案2】:

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

但是在 C# 中,就像关于 struct 源代码的两件事 c#中的DataTime,我们可以直接使用一个NAME(i.e.,DataTime) 结构来访问其成员(即 Maxticks),即 DataTime.Maxticks

显然有一些不同,对吧?

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

来自 C# 规范:

方法是实现计算或动作的成员,它可以 由对象或类执行。静态方法被访问 通过课堂。实例方法通过实例访问 班级。

static 关键字的最佳解释之一可以在 MSDN 中找到。

对于 C# 中 struct 成员的访问,您使用与 C# 中访问 class 成员相同的运算符,即点运算符。这就是为什么你需要DayOfWeek.Sunday

【讨论】:

  • 非常感谢...但是对于 DayOfWeek 部分,DayOfWeek 是一个枚举,而不是一个类;我在哪里可以找到官方文档说“星期日”是枚举 DayOfWeek 的七个值之一,可以使用DayOfWeek.Sunday 检索?毕竟,这在 C 中似乎是不允许的?
  • @J.C.你欢迎老兄。链接msdn.microsoft.com/en-us/library/… 提供了您正在寻找的文档。请让我知道,如果这有帮助。谢谢
  • 非常感谢您的帮助!根据人们对我的反馈和我最近的经验,MSDN 是 C# 程序员(尤其是像我这样的初学者)可以获得大量关于该语言的信息和宝藏的地方。关键是怎么用!对于这个问题,真正的问题可能是:档案成员访问范围、明确的解决方案和资格。
  • @J.C.你欢迎老兄。是的,可以肯定的是,总的来说,MSDN 有很大帮助(相信我,不仅是初学者)。你会找到从中学习的方法。这是个人的事情。
【解决方案3】:

将其视为在命名空间中导航。您的项目结构可能是:

  • 我的应用程序
    • 表格
      • 主窗体
        • ShowForm()
        • IsOpen()
      • 某类
        • SomeStaticMethod()
        • NonStaticMethod()
      • 其他类
        • 一些枚举
          • EnumValueOne
          • EnumValueTwo
    • 存储库
      • 这个回购

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

当您将using 语句添加到您的类时,您显然不需要执行完整的限定命名空间,但希望这能说明这个概念。

【讨论】:

    猜你喜欢
    • 2013-03-31
    • 2011-03-27
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多