【问题标题】:Why does VB not prevent the use of "Me" in field initialization like C# does with "this"?为什么 VB 不会像 C# 中的“this”那样阻止在字段初始化中使用“Me”?
【发布时间】:2015-02-09 01:14:13
【问题描述】:

在 VB 中你可以这样:

Class One
    Private myTwo As Two = New Two(Me)
End Class

Class Two
    Sub New(withOne As One)

    End Sub
End Class

但在 C# 中,你不能这样做:

class One
{
    private Two myTwo = new Two(this);
}

class Two
{
    public Two(One withOne)
    {

    }
}

因为您收到错误“关键字 'this' 在当前上下文中不可用”。

我发现 this question/answer 引用了 the C# language specification 第 7.6.7 节:

7.6.7 此访问权限

只有在实例构造函数的块中才允许 this 访问,即实例 方法或实例访问器。 ...(省略细节)...在主要使用这个- 在上面列出的上下文之外的上下文中的表达式是编译时错误。在
特别是,不可能在静态方法、静态属性中引用 this
访问器,或在字段声明的变量初始化器中。

此外,this question 涵盖了它(尽管在我看来,并没有充分回答它),并且 Oblivious Sage 对我的问题的回答解释了原因——因为它是防止错误的功能。

为什么 VB 忽略了这个功能?

【问题讨论】:

  • 这个问题似乎离题了,因为它是关于猜测语言设计者选择做出特定决定的原因。
  • @Servy -- 你只是在编造这个理由吗?
  • 初始化对象时操作顺序可能不同。 C# 不允许这样做,因为 myTwo 初始化程序将在 创建 One 是一个有效对象之前运行。
  • @roryap 我使用了自定义关闭原因,是的。我本可以改用“主要基于意见”,它会适用,但为了清楚起见,我选择更明确。任何人都可以做的一个问题是猜测别人在想什么,这不是这里的主题。
  • @Servy -- 你认为这一切都错了。

标签: c# vb.net clr


【解决方案1】:

this question 中所述,区别在于构造函数在 VB.NET 中运行 before 字段初始化程序,而在 C# 中运行 after 字段初始化程序。因此,在 VB.NET 中,Me 在初始化程序运行时是一个有效的引用,但在 C# 中,this 在它们运行时还不是一个有效的引用。

每个Eric Lippert C# 这样做是为了保证只读字段在被引用之前总是被初始化。

我没有看到它在任何地方明确说明,但如果我不得不猜测他们在 C# 仍在开发时注意到了 VB.NET 中的缺陷;然后他们觉得这是一个足够大的问题,值得在 C# 中修复,但还不足以对 VB.NET 进行重大(可能是广泛的)更改。

【讨论】:

  • 另外,恭喜你打破四位数...欢迎来到俱乐部 :)
  • 你确定不在vb.net的一两个设计师之间? :-)
  • 好答案;稍微澄清一下:只读字段在被引用之前被初始化是一个理想的结果,但该功能更普遍地防止在其构造函数运行之前访问对象的成员而导致的整个类错误。
猜你喜欢
  • 2011-11-01
  • 2014-06-09
  • 2019-06-28
  • 1970-01-01
  • 2016-09-15
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多