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

dominic02 2013-12-26 09:08:45
例如,我想在类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#的这个限制,其意义是什么,有什么样的考虑才加上了这个限制?

谢谢。
...全文
3061 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
高坚果兄弟 2016-09-17
  • 打赏
  • 举报
回复

static public void aa() { }
public void aa() { }
实例不能调用静态方法,特么又不让编译通过,用过的最霸道的语言 经鉴定 c#里静态方法最多值两毛钱,通用方法以后不再写成静态,通通的用单例,既可以直接调用,又可以当变量传递,妥妥的 实在不行就将就着,以前写的静态方法现在要全部封装一遍了,反正现在是不行了
qq_35734472 2016-08-01
  • 打赏
  • 举报
回复
为了安全考虑,vs编译器会有解释。有些人问题都没看清楚就。。。
CGDreamer 2016-05-23
  • 打赏
  • 举报
回复
引用 10 楼 wddw1986 的回复:
[quote=引用 8 楼 yuwenge 的回复:] [quote=引用 7 楼 u013277699 的回复:] 感谢楼上几位的解释。 我的问题在于,Java和C++都没有这样的限制,类的静态成员可以被实例访问。 但是C#看起来有这样的限制。这样的限制能带来什么好处吗,还是C#当初设计的时候有什么考虑?
我觉得你三个语言都要重头学起。[/quote] 很是同意,都说半瓶水晃,但是感觉楼主半瓶水都没有。[/quote] 不好意思 不是故意挖坟 只是是觉的楼上2个特别的无聊 你们牛B你们回答问题啊 回答不出来就别瞎BB!让人觉得恶心
qq_30251289 2015-09-09
  • 打赏
  • 举报
回复
我好像懂了楼主的意思,在php里面也没有这个限制。但是在c#里面确实会有这个限制,不知道为什么实例化后的对象不能调用静态方法。(据说是出于安全考虑)
jingyi130705008 2015-04-21
  • 打赏
  • 举报
回复
貌似是为了规范化,Java中允许实例调用类方法也会有警告。
dominic02 2013-12-26
  • 打赏
  • 举报
回复
引用 10 楼 wddw1986 的回复:
[quote=引用 8 楼 yuwenge 的回复:] [quote=引用 7 楼 u013277699 的回复:] 感谢楼上几位的解释。 我的问题在于,Java和C++都没有这样的限制,类的静态成员可以被实例访问。 但是C#看起来有这样的限制。这样的限制能带来什么好处吗,还是C#当初设计的时候有什么考虑?
我觉得你三个语言都要重头学起。[/quote] 很是同意,都说半瓶水晃,但是感觉楼主半瓶水都没有。[/quote] 我们回到问题吧,csdn是向各位学习和讨教的场所,不是大家互相瞧不起的场所。 我做了实验,确实Java和C++没有这个方面的限制。我很想知道C#作出这样的限制,是出于哪个方面的考虑吗? 谢谢。
  • 打赏
  • 举报
回复
静态方法不需要再new一个对象就可以 类名.方法 直接调用就OK
卧_槽 2013-12-26
  • 打赏
  • 举报
回复
引用 7 楼 u013277699 的回复:
感谢楼上几位的解释。 我的问题在于,Java和C++都没有这样的限制,类的静态成员可以被实例访问。 但是C#看起来有这样的限制。这样的限制能带来什么好处吗,还是C#当初设计的时候有什么考虑?
我觉得你三个语言都要重头学起。
dominic02 2013-12-26
  • 打赏
  • 举报
回复
感谢楼上几位的解释。 我的问题在于,Java和C++都没有这样的限制,类的静态成员可以被实例访问。 但是C#看起来有这样的限制。这样的限制能带来什么好处吗,还是C#当初设计的时候有什么考虑?
cjh18168 2013-12-26
  • 打赏
  • 举报
回复
静态方法不需要再new一个对象就可以 类名.方法 直接调用了....
BenBenBears 2013-12-26
  • 打赏
  • 举报
回复
对于你的疑惑,书上是这么写的,可以将静态字段、属性视为是类的全局变量,可以访问独立于任何对象实例的数据。也就是说这种调用方式是为了方便访问这类全局变量,不需要每次访问时都实例化。我是这么理解的。
xiaoyuan402 2013-12-26
  • 打赏
  • 举报
回复
静态方法不属于实例,直接 类名.方法() 调用就可以了。
  • 打赏
  • 举报
回复
静态类是程序在一开始运行的时候就为其分配了内存空间,而非静态类是在实例化的时候才为其分配内存空间。调用静态类和非静态类里面的方法基本上是没有区别的,主要还是看变量。为了数据安全起见,用非静态类比较好,但也不一定,具体问题具体分析吧。
BenBenBears 2013-12-26
  • 打赏
  • 举报
回复
不能通过实例引用静态成员。然而,可以通过类型名称引用它。例如,请考虑以下类:

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
cheng2005 2013-12-26
  • 打赏
  • 举报
回复
静态方法不属于实例(对象),属于类。 请用 类名.方法() 调用 要是不区分不开什么叫做“类”,什么叫“对象”,那就是另一个问题了。

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧