C# 中修饰符的基础结构和行为

Posted

技术标签:

【中文标题】C# 中修饰符的基础结构和行为【英文标题】:Underlying structure and behavior of modifiers in C# 【发布时间】:2013-11-12 18:11:20 【问题描述】:

访问修饰符如 public 和关键字如 virtual 自定义类或属性的行为。所以它们的行为类似于属性。但是它们在内部是如何工作的呢?他们是否从 .Net 类库中调用任何代码或任何属性?

【问题讨论】:

不确定我是否理解这个问题??你想知道它们是做什么的,或者在代码库中定义的位置吗? 谷歌?我想你可以很快找到这样的答案.... 然后找到答案并贴出来:-) “它们在内部是如何工作的?”编译器团队可能不得不为您回答这个问题。虽然我怀疑它是专有的,唯一好的答案是“符合规范”。 “它们在内部是如何工作的” - 您想讨论元数据格式和 .NET 程序集中的 MethodDef 表吗? 【参考方案1】:

不,public 是 access modifier。 Virtual 是您正确指出的关键字,尽管它们都没有特别引用任何 .NET 库。它们不引用任何属性,因此将它们称为属性是不正确的。 Attributes 明显不同。

它们在内部是如何工作的?

请参阅上面提供的链接。

他们是否从 .Net 类库中调用任何代码或任何属性?

不,如前所述,它们与属性明显不同,并且不与任何 .NET 库相关联。

【讨论】:

【参考方案2】:

不,它们分别告诉 C# 编译器如何处理可访问性和继承方面的方法。

它们与 .Net 类库无关。此外,“属性”一词在 C# 的上下文中具有非常特定的含义,它们与这些关键字无关。

【讨论】:

【参考方案3】:

public 和 virtual 基本上是保留字,这意味着它们具有特定的含义。 当编译器识别这些保留字时,它将采取设计架构中定义的必要操作。因此用户不能将保留字声明为标识符。我认为他们不会引用数据类型之类的东西(数据类型将在内部被引用,因为它们被设计为结构。)

【讨论】:

【参考方案4】:

它们是语言的一部分。它们被称为keywords,由语言保留,并将根据它们的作用在编译器中显式解析。它们是保留的,所以你不能这样做:

  User public = new User();

在此我使用“public”关键字作为变量名,这在 C# 语法中是非法的。如果发现某个关键字使用不当,编译器将不会编译您的代码。 (通常在 IDE 中,如果出现错误,编译器甚至不会被调用)

需要注意的一点是,它们不是操作员。 (如 + - =)。运算符,在许多事情中,可以重载(您可以定义它们如何改变您的数据)。在 C# 中(我不能保证其他语言),关键字不能重载。

编程语言中的keyword 通常用于告诉编译器如何处理特定上下文中的特定代码段。使用某些关键字的某些效果比其他关键字更明显。有点像这个代码在做什么的提示(在你的情况下,它的保护级别是什么)。每个keyword 都有自己的行为规则。例如,LINQ 有自己的运算符,如 aswhereselect,不能像 publicprotectedprivate 这样使用。

有关 C# 中关键字的更多信息,请查看以下内容:

http://msdn.microsoft.com/en-us/library/x53a06bb.aspx

【讨论】:

【参考方案5】:

public 关键字是对编译器的指令,称为访问修饰符。这意味着您希望某个类型或成员可以公开访问,即以不受限制的方式访问。

微软在这里描述得很好:

http://msdn.microsoft.com/en-us/library/yzh058ae(v=vs.80).aspx

virtual 关键字是编译器的另一条指令。它是一种不同于 public修饰符。它与访问无关。相反,它表示您打算能够覆盖派生类中给定方法/属性的行为。

微软在这里有一个很好的描述:

http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.71).ASPX

它们都与属性有任何关系,这是一个完全不同的概念。它们在此处进行了描述:

http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx

【讨论】:

以上是关于C# 中修饰符的基础结构和行为的主要内容,如果未能解决你的问题,请参考以下文章

C# const和readonly修饰符的区别

C# 入口点类修饰符

const 和 readonly 修饰符的用法

c# 曾经面试题

JAVA基础学习-修饰符的使用

Kotlin 中内部可见性修饰符的范围