C# 类型声明隐式地是静态成员

C# 类型声明隐式地是静态成员,c#,C#,我认识的一个人刚刚让我解释这句话,我目瞪口呆 常量或类型声明隐式地是静态成员 “或类型声明隐式地是静态成员”这句话对我来说毫无意义 这意味着什么?在本文的上下文中,我相信他们只是将类型定义为内部结构、内部类和枚举的定义,它们总是可以在静态上下文中作为类型引用。常量是隐式静态的,但它与普通静态字段的不同之处在于,它不能在程序执行期间更改。但是它仍然是静态的。对我来说,类型声明隐式地是静态成员是有意义的。 因为如果你有课: class Foo { public class Bar {

我认识的一个人刚刚让我解释这句话,我目瞪口呆

常量或类型声明隐式地是静态成员

“或类型声明隐式地是静态成员”这句话对我来说毫无意义


这意味着什么?

在本文的上下文中,我相信他们只是将类型定义为内部结构、内部类和枚举的定义,它们总是可以在静态上下文中作为类型引用。

常量是隐式静态的,但它与普通静态字段的不同之处在于,它不能在程序执行期间更改。但是它仍然是静态的。

对我来说,
类型声明隐式地是静态成员是有意义的。

因为如果你有课:

class Foo
{
   public class Bar
  {
  }
}
无法通过以下方式访问类

Foo f = new Foo();
Bar b =new f.Bar();
(我甚至不知道如何写才能让它有意义)。
如果要访问
Bar
类,需要执行以下操作:

Bar b = new Foo.Bar()
您可以通过类而不是实例来访问它。对象的属性

因此,
Bar
Foo
的静态成员

这意味着当您定义这样的类时

 public class Message
    {

        const int i = 10;

        enum NewType{ typeval, typevale2 }


    }

这里两者都是隐式静态成员

类型声明

类型声明是类声明(第10.1节)、结构声明(第11.1节)、接口声明(第13.1节)、枚举声明(第14.1节)或委托声明(第15.1节)

来自MSDN文档

静态成员

当字段、方法、属性、事件、运算符或构造函数声明包含静态修饰符时,它将声明静态成员。此外,常量或类型声明隐式声明静态成员。静态构件具有以下特征:

  • 当静态成员M在形式E.M的成员访问(第7.5.4节)中被引用时,E必须表示包含M的类型。E表示实例是编译时错误
  • 静态字段仅标识一个存储位置。无论创建了多少个类实例,静态字段都只有一个副本
  • 静态函数成员(方法、属性、事件、运算符或构造函数)不在特定实例上操作,在这样的函数成员中引用它是编译时错误
来自MSDN文档


这意味着
常量
和所有类型的
类型声明
都是静态的,没有添加关键字
静态

谢谢。我也怀疑。让我们看看C#团队中是否有人可以提供见解。即使是类也是名称空间的静态成员。该实现与java不同,因为java中的嵌套类不是静态成员。@TGH是,读MSDN,类型声明是隐式静态成员。我们访问嵌套类就像访问静态成员一样。Infact类是命名空间的静态成员,这是低级.net framework实现。@AkashKava:两件事:(1)您能给我指出一个权威来源,比如CLR文档中声明类型声明作为静态成员实现的部分吗?因为尽管自然地假设这一点是有道理的,但在做出假设之前最好先查找文档。(2) 即使这是真的,该语句出现在C语言文档中也毫无意义。之所以出现在语言规范中,是因为它与java不同。在这个答案中,通过类的实例访问嵌套类的第一种方法是可能的,并且嵌套类不能在没有父实例的情况下实例化。在java中,每个嵌套类都将父实例的引用作为闭包。在C#中的其他地方,嵌套类可以在没有父实例的情况下创建。这是一个重大的设计决策,因为它改变了程序员使用它的方式。并不是.net框架,而是C#强加了这种设计。您可以创建自己的语言并支持java类的嵌套类。谢谢,Akash。你说的很有道理。有什么地方可以让我读到更多关于它的信息吗?关于类型呢?您只回答了一半的问题。谢谢您的帮助,但这只是说明了问题的作用,没有解释任何内容。所有这些都解释了什么是静态成员。除了一句话之外,没有一句与我提出的问题有关。这句话正是我想知道的意思。谢谢你,拉杰什。这是有道理的,我倾向于自然而然地认为这就是意义所在。你能给我指一些明确说明这一点的文件吗?