【问题标题】:Why in C# this is not allowed in member initializer, but in VB.Net Me is allowed为什么在 C# 中成员初始化程序中不允许这样做,但在 VB.Net 中允许我
【发布时间】:2013-03-01 03:19:32
【问题描述】:

我正在将一个 VB.Net 应用程序转换为 C#,并注意到在 VB.Net 代码中,有一个私有成员变量,它使用 Me 初始化,如下所示:

Private m_ClassA As New MyCollection(Of ClassA)(Me)

当我将它转换成这样的 C# 代码时:

private MyCollection<ClassA> _classA = new MyCollection<ClassA>(this);

我有错误

参数是value,而参数类型是ref

如果我把ref 放在参数this 前面,我会得到错误

不能在成员初始化器中使用this

我在这里读到成员在基类之前初始化,因此this 不能在成员中使用,因为它可能尚未初始化。我的问题是为什么它在 VB.Net 而不是 C# 中是合法的?

这取决于编译器处理它的方式不同吗?两者的行为不同,这似乎很奇怪。

为了解决这个问题,我想我会在构造函数中初始化成员。

【问题讨论】:

  • 听起来你已经回答了你的问题。
  • 什么是MyCollection
  • 什么是ClassAMyCollection?很容易做出可能是错误的假设... MyCollection 是否已使用不必要的 ref 参数声明?
  • 尝试使用反编译器获取IL代码。在某处回答。
  • MyCollection is Public Class MyCollection(Of T) Inherits ObjectModel.Collection(Of ClassA) 由于某种原因,MyCollection 在构造函数中确实有一个 ref 参数,我也将其删除。

标签: c# vb.net


【解决方案1】:

根据MSDN.

只有在实例的块中才允许 this 访问 构造函数、实例方法或实例访问器。

这可以阅读here

除了实例/构造函数之外,您无法在任何地方访问它。所以你也不能这样做:

public class Foo
{
  private Foo _foo = this;
}

正如您所说,在C# 中您将不得不使用方法/构造函数。

public class Foo
{
  private Foo _foo;
  public Foo()
  {
    _foo = this;
  }
  public void InitializeFoo()
  {
    _foo = this;
  }
}

MSDN 还为Me 声明了以下内容:

Me 关键字提供了一种引用特定实例的方法 代码当前正在其中执行的类或结构。我 行为类似于对象变量或结构变量 引用当前实例。

听起来好像一旦类执行了你就可以访问this,但只能在实例方法中,而在VB.NET你可以在类执行时访问,因此你不能使用的原因正如你所说的那样。

【讨论】:

  • @Matt_J 没问题。就个人而言,我会发现构造函数初始化更整洁 - 但这可能归结为更喜欢C#:P
【解决方案2】:

VB 在 .NET 和 VB.NET 之前就已经存在,因此在引入 .NET 时,一些开发人员不想删除的功能已经存在。另一个这样的功能是“On Error Resume Next”,这在 C# 中也不存在。

【讨论】:

  • 除了 On Error Resume Next 不在 VB.NET 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2011-08-17
  • 2013-09-07
  • 1970-01-01
  • 2020-05-01
  • 2017-12-13
  • 1970-01-01
相关资源
最近更新 更多