为什么C#类的静态方法,普通实例不能调用呢?

.Net技术 码拜 9年前 (2015-05-10) 2546次浏览 1个评论
 

例如,我想在类A里面放一个计数器,看看创建出来的类的实例有多少符合特定的条件

    struct C
    {
        public static void f()
        {
            Console.WriteLine("f()");
        }
    }
......
    C obj=new C();
    obj.f();

最后一行代码会得到一个编译错误:

error CS0176: Member ""Program.C.f()"" cannot be accessed with an instance reference; qualify it with a type name instead

为什么不能从实例去调用一个类的静态方法呢? 我尝试了Java和C++都是可以这么做的。C#的这个限制,其意义是什么,有什么样的考虑才加上了这个限制?

谢谢。

静态方法不属于实例(对象),属于类。

请用 类名.方法() 调用

要是不区分不开什么叫做“类”,什么叫“对象”,那就是另一个问题了。

5分
不能通过实例引用静态成员。然而,可以通过类型名称引用它。例如,请考虑以下类:

public class MyBaseC
{
    public struct MyStruct
    {
        public static int x = 100;
    }
}

若要引用静态成员 x,请使用完全限定名(除非可从相同范围访问):
MyBaseC.MyStruct.x

想了解更详细的可以看官方解释http://msdn.microsoft.com/zh-cn/library/98f28cdx(v=vs.90).aspx

5分
静态类是程序在一开始运行的时候就为其分配了内存空间,而非静态类是在实例化的时候才为其分配内存空间。调用静态类和非静态类里面的方法基本上是没有区别的,主要还是看变量。为了数据安全起见,用非静态类比较好,但也不一定,具体问题具体分析吧。
5分
静态方法不属于实例,直接 类名.方法() 调用就可以了。
5分
对于你的疑惑,书上是这么写的,可以将静态字段、属性视为是类的全局变量,可以访问独立于任何对象实例的数据。也就是说这种调用方式是为了方便访问这类全局变量,不需要每次访问时都实例化。我是这么理解的。
5分
静态方法不需要再new一个对象就可以 类名.方法 直接调用了….
感谢楼上几位的解释。

我的问题在于,Java和C++都没有这样的限制,类的静态成员可以被实例访问。
但是C#看起来有这样的限制。这样的限制能带来什么好处吗,还是C#当初设计的时候有什么考虑?

5分
引用 7 楼 u013277699 的回复:

感谢楼上几位的解释。

我的问题在于,Java和C++都没有这样的限制,类的静态成员可以被实例访问。
但是C#看起来有这样的限制。这样的限制能带来什么好处吗,还是C#当初设计的时候有什么考虑?

我觉得你三个语言都要重头学起。

5分
静态方法不需要再new一个对象就可以 类名.方法 直接调用就OK
5分
引用 8 楼 yuwenge 的回复:
Quote: 引用 7 楼 u013277699 的回复:

感谢楼上几位的解释。

我的问题在于,Java和C++都没有这样的限制,类的静态成员可以被实例访问。
但是C#看起来有这样的限制。这样的限制能带来什么好处吗,还是C#当初设计的时候有什么考虑?

我觉得你三个语言都要重头学起。

很是同意,都说半瓶水晃,但是感觉楼主半瓶水都没有。

引用 10 楼 wddw1986 的回复:
Quote: 引用 8 楼 yuwenge 的回复:
Quote: 引用 7 楼 u013277699 的回复:

感谢楼上几位的解释。

我的问题在于,Java和C++都没有这样的限制,类的静态成员可以被实例访问。
但是C#看起来有这样的限制。这样的限制能带来什么好处吗,还是C#当初设计的时候有什么考虑?

我觉得你三个语言都要重头学起。

很是同意,都说半瓶水晃,但是感觉楼主半瓶水都没有。

我们回到问题吧,csdn是向各位学习和讨教的场所,不是大家互相瞧不起的场所。

我做了实验,确实Java和C++没有这个方面的限制。我很想知道C#作出这样的限制,是出于哪个方面的考虑吗?
谢谢。

貌似是为了规范化,Java中允许实例调用类方法也会有警告。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明为什么C#类的静态方法,普通实例不能调用呢?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!

(1)个小伙伴在吐槽
  1. I had no idea how to approach this befooe-nrw I'm locked and loaded.
    Geraldine2017-07-17 07:28 回复