C#的内部类不能直接访问外部类的非静态成员?

werwer98 2014-02-25 11:08:07
下面的几行程序,编译没有问题:

class outer
{
public static int x;
public class inner
{
inner() { Console.WriteLine(x); }
}
}

但是如果把public static int x的static去掉,编译就不过了。
为什么C#的语法设计是内部类只能访问外部类的静态成员? java就没有这个限制。
...全文
988 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
梁金堂 2016-03-12
  • 打赏
  • 举报
回复
java的内部类 是个编译前的概念,编译后就不存在所谓的内部类了,这个可以反编译验证。其实,内部类真正的构造方法的第一个参数就是外部类的实例引用,也正因为每个内部类对象都存在一个生命周期极长的外部类实例引用,在某些古老的GC面前,存在内存泄露的可能,不过现在一般不会了。所以,C#只需要添加一个外部类引用作为成员就好了。
lulianqi 2015-12-03
  • 打赏
  • 举报
回复
其实原因还是比较简单的 .NET 后面出来的 感觉语义跟语法糖 都比java 好一点 (PS 不是说java不优秀,勿喷) 对C# 其实严格来说没有java 里的“内部类”的概念。 类里面的类也是一个类,只是访问路径有些不同,它完全也是一个独立的class (个人认为也本该如此) 所以自然而然一个类里的方法,怎么可能去访问另外一个没有实例化的类的成员变量。 说白了就是“上一层类”的成员现在根本就不存在,当然 如果是静态变量,就不需要实例化,就会有一份数据。 而java的处理则十分不同,对于java内部类的实例,是一定会绑定在外部类的实例上的,正是这样的设计保证了在内部类里操作的时候,外部类一定已经被实例化了,所以自然可以使用它的成员。也就是说在java里,内部类是不能单独存在的,也就是说不能单独的实例化(虽然通过特殊的写法可以在其它类里实例化类部类,不过也是在外部类已经被实例化的前提下) 问题虽然过去很久了,虽然不一定帮得到lz,也希望可以帮助后面朋友。 最近自己也在学习,如有错误还请指正,共同进步
baidu_22237277 2015-08-27
  • 打赏
  • 举报
回复
今天也遇到了这个问题,解决办法是把外部类对象的引用(this)作为内部类的构造函数然后引用,这样做可以直接访问外部类的私有成员
thy442030800 2015-05-26
  • 打赏
  • 举报
回复
这是挖坟么。 java中是通过Outer.this.x来访问的
uu草莓 2014-06-25
  • 打赏
  • 举报
回复
1楼没用过JAVA 鉴定完毕!
leonshon 2014-03-04
  • 打赏
  • 举报
回复
一楼下结论这么肯定,正好是在说自己,一定是没用过JAVA吧
werwer98 2014-02-25
  • 打赏
  • 举报
回复
引用 1 楼 wddw1986 的回复:
我只能回两个字,呵呵。 你确认JAVA不是这样吗? 半瓶水最好站稳点,别晃。
Java是可以的:

public class Outer
{
    public int x = 2;
    public class Inner{
        public Inner(){System.out.println(x);}
}
叫我猫爷_ 2014-02-25
  • 打赏
  • 举报
回复
回炉吧.
Regan-lin 2014-02-25
  • 打赏
  • 举报
回复
每个语言都有自己的语法的,static调用应该是默认当前类的this所以就会编译过去没问题了
夜色镇歌 2014-02-25
  • 打赏
  • 举报
回复
cheng2005 2014-02-25
  • 打赏
  • 举报
回复
我只能回两个字,呵呵。 你确认JAVA不是这样吗? 半瓶水最好站稳点,别晃。
mfmdth 2014-02-25
  • 打赏
  • 举报
回复
qiu da an
tcmakebest 2014-02-25
  • 打赏
  • 举报
回复
静态成员为什么可以访问,因为仅此一份, 非静态成员是每个实例对应有一个,首先要有实例,没有实例当然无法访问了。
clark523 2014-02-25
  • 打赏
  • 举报
回复
随便吐个槽。 看电视剧的时候大家都喜欢这么问。 为什么xx要xx? 我每次听见都想回一句。 因为导演安排的。 所以对于你这个答案。我只想说。 因为微软这样设计的。
魂之挽歌来袭 2014-02-25
  • 打赏
  • 举报
回复
是不是有这种情况 就是内部类实例化了 而外部类还未实例化 这样内部类就不能访问外部类的非静态成员了
werwer98 2014-02-25
  • 打赏
  • 举报
回复
求回答!....
lasesiwen 2014-02-25
  • 打赏
  • 举报
回复
楼主应该再重温下类对象的初始化

110,534

社区成员

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

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

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