2011-03-03 154 views
8

这里就是我谈论的例子...为什么不能通过实例变量访问共享/静态成员?

Public Class Sample1 

    Public Shared Function MyValue() As Integer 
     Return 0 
    End Function 

    Public Sub Code() 
     Dim ThisIsBad = Me.MyValue 
     Dim ThisIsGood = Sample1.MyValue 
    End Sub 

End Class 

Me.MyValue给出VB.NET警告,(相当于代码给出)在C#中的错误。这是否有特别的原因?我发现使用'Me.MyValue'访问共享函数更直观/自然 - 但我避免它将我的警告保持为0.

是否有其他人只是决定'呃,这样做更有意义其他方式“还是有一些我不明白的技术原因?

编辑:

谢谢大家。我在想它是错误的,更像是OOP中的“子类”。即使在基类中声明了某些东西,也可以通过您拥有的实例来访问它。但是这种关系与共享或静态关系并不相同。

回答

7

静态成员的定义是在水平,而不是实例级别,所以访问使用this(或VB me)的静态成员并没有真正感受到的权利声明(而不是正确的在C# )

this.something(或me.something)意味着你正在访问“东西”这是特定于特定的实例,同时,再次,静态成员在整个该类的所有实例共享。

+0

这。 MyValue函数不属于任何一个实例;因此应该在单个实例的范围之外访问它。试图使用me.MyValue的C#等价物会导致编译器错误,所以即使在VB中允许它也是不好的。 – KeithS 2011-03-03 16:03:59

+0

@KeithS - 你是否打算成为答案或对我的答案发表评论? – 2011-03-03 16:06:04

+2

评论。我打算说完全一样的事情,所以我只是夸耀你并用我的方式说出来。 :) – KeithS 2011-03-03 16:07:36

2

Me指向当前实例的Sample1,而MyValue不属于本身类。因此,VB.NET提醒你看起来很好。

顺便说一句,Java那样它以同样的方式:

Thread.currentThread().sleep(1000); // warning, as sleep is static 
Thread.sleep(1000); // correct 

干杯 马蒂亚斯

3

它误导你的代码的读取器。

代码应该写入其他程序员阅读和理解,我不知道项目的每个细节。通过实例访问静态变量使其看起来像一个实例成员 - 您必须检查该声明才能看到您错误。

“其他程序员”在半年后也许就是你。

1

当你有一个实例和同名的静态成员的情况下,编译器很可能保护你免于犯错。

class X { 

    static public void X1() 
    { 
     Console.WriteLine ("Static"); 
    } 

    public void X1 (bool x1 = false) 
    { 
     X1(); // Which one is this calling? 
     Console.WriteLine ("Instance"); 
    } 
} 

void Main() 
{ 
    X.X1(); // Static 
    new X().X1 (false); // Instance 
} 

结果:

  • 静态
  • 静态
  • 实例
1

您不能this参考访问类级别字段,并且您无法通过类访问对象级别字段引用它非常有意义。

如果你是通过this指针访问类级别字段,你最终可能会以如下奇怪的代码

objA.StaticVariable=1; 
objB.StaticVariable=2; 

这可能会误导别人,我们实际上是在编辑不同的属性或字段,但如果是通过访问班级名称

Class.StaticVariable=1 
Class.StaticVariable=2 

其明确表示我们正在编辑同一件事。

另外在内存静态字段存储在完全不同的地方(接近Type对象),比对象字段,所以我觉得它的超级明显的区别。

真正的问题是 - 为什么它不是VB.NET中的错误。我猜测答案是VB是继承了一些旧的非.NET VB功能,这是非常安全的类型和它的这种继承的奇怪结果。

相关问题