2014-07-22 26 views
2

对不起,关于最后的帖子...这是另一个。关于c的点(。)运算符#

到目前为止,我似乎人们使用运营商(。):

结构的

(1)进入构件

(2)访问静态/恒一类的成员

( 3)访问字面一个枚举类型

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

的withou t具有该结构/类/对象的对象/实例

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

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

例如,在(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

有明显的差一些,右?

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

**我实际上并不喜欢通过逐个使用这个操作的例子来学习,因为他们没有告诉我“如何使用它”,而只是“我能做什么用它”;虽然这两个是不同的。

+1

阅读静态关键字。 –

+1

我建议您阅读[帮助](http://stackoverflow.com/help/)部分[我可以询问什么主题?](http://stackoverflow.com/help/on-topic)。 –

+0

这是关于作用域... [instanceName]。[instanceMember],[ClassName]。[StaticMember],[EnumName]。[EnumMember],this。[CurrentInstanceMember] - 左侧定义范围。基本上总是意味着“在左侧范围内”,然后右侧是您尝试访问的范围的哪一部分。 – Tim

回答

1

正如您所注意到的,.运算符用于访问成员。

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

枚举不是static,但它们的成员以相同的方式访问,因为您需要合格具有枚举名称的成员名称。从C#规范(V 5.0,部分14.3):

从所有其它代码,枚举成员的名称必须以 其枚举类型的名称限定。枚举成员没有任何已声明的 可访问性 - 如果可以访问包含枚举类型 的枚举成员,则该枚举成员是可访问的。

.的一个用途是限定某些内容(例如,当您明确声明某个类将从哪个命名空间中出来时)。

基本上,只要你想访问某个东西的成员就可以使用.。只要知道它是一个实例还是静态变量,就会知道是否需要该类型的实例,或者是否可以使用类名称。 .也可以用来限定某些东西的名称,当为类指定名称空间或使用枚举时使用该名称。

+0

“枚举不是'静态的,但它们的成员以相同的方式访问”这是我的问题的地方......在哪里可以找到这个规则????? –

+0

@ J.C。添加了一些关于''的内容。运算符被用于名称限定,并且规范的相关部分指出这是枚举所必需的。希望这有助于! – BradleyDotNET

+0

再次感谢您!在发布评论之后,我查看了一些做枚举变量赋值的例子,并且认为这样的限定是必要的。我也试图在C中产生相同的情况,但我失败了; C不允许出现这种情况(即赋予不同的枚举成员相同的名称),而C#则可以。尽管如此,在C#中这个资格(在enum成员访问中)看起来是非常必要的,即使在这种情况下也是如此,这里可能是对lang设计的一种折衷! –

0

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

但在C#,就像在约结构 DATATIME的源代码在c#两件事情,我们可以直接使用 结构的名称(即,DATATIME)来访问它的构件(即,Maxticks),即,DATATIME .Maxticks

显然有一些区别吧?

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

从C#规格:

的方法是一种用于实现可以通过 对象或类执行的计算或操作的部件。通过类访问静态方法 。实例方法通过类的实例 来访问。

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

至于在C#中访问struct的成员,您可以使用与C#中的class的成员相同的运算符(点运算符)。这就是为什么你需要DayOfWeek.Sunday的原因。

+0

非常感谢...但是对于DayOfWeek部分,DayOfWeek是枚举,而不是类;我在哪里可以找到一个官方文档,说“星期天”是枚举DayOfWeek的七个值之一,可以使用'DayOfWeek.Sunday'检索?毕竟,这似乎不被允许在C? –

+0

@ J.C。你欢迎老兄。链接http://msdn.microsoft.com/en-us/library/system.dayofweek(v=vs.110).aspx提供了您正在查找的文档。请让我知道,如果有帮助。谢谢 – Christos

+0

非常感谢您的帮助!根据人们对我的反馈以及我最近的经验,MSDN是一个C#程序员(特别是像我这样的初学者)可以获得大量信息并珍爱这门语言的地方。关键是如何使用它!对于这个问题,真正的问题可能是:档案成员访问范围,明确的解决方案和资格。 –

0

认为它是导航命名空间。你的项目结构可能是:

  • MyApp的
    • 形式
      • 的MainForm
        • ShowForm()
        • ISOPEN()
      • SomeClass的
        • SomeStaticMethod()
        • NonStaticMethod()
      • OtherClass
        • SomeEnum
          • EnumValueOne
          • EnumValueTwo
      • ThisRepo

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

当您向您的课程添加using声明时,您显然不需要执行完整限定名称空间,但希望这会显示该概念。