日期:2014-05-18  浏览次数:20395 次

一个超简单的问题,自认为高手的进来!!!!!!!!!!!!!!!!
今天上午遇到一个问题,超郁闷。自己写了一个类,类里一个方法,用来获得数据。我在类里声明了两个字段,结果一直提示“字段初始值设定项无法引用非静态字段、方法或属性”,而在方法体内声明同样类型的两个字段,就正确。希望高手们从理论上好好解释一下!我声明的类示例如下:

public partial class _Default : System.Web.UI.Page 
{
  string x = "asdfasdfasdf";
  string y="asdf"+x;//这样错误,没法访问
   
  protected void Page_Load(object sender, EventArgs e)
   
  {
  string a = "asdf";
  string b = "fasdf" + a;//这样在方法体内就正确

  Response.Write(b);
   
  }
   
}

这些应该是基础,不知道同样类型的x,y和a,b,为什么x,y不行,而a,b可以用呢?请给出详细些的理论解释!谢谢

------解决方案--------------------
虽然会这个问题,但是决定不回答,因为:
1:不是高手,你这个题目太让人反感;你不用激大家也会有人进来看;
2:你好长时间前的帖子还没有结;
------解决方案--------------------
探讨
虽然会这个问题,但是决定不回答,因为:
1:不是高手,你这个题目太让人反感;你不用激大家也会有人进来看;
2:你好长时间前的帖子还没有结;

------解决方案--------------------
public partial class Default2 : System.Web.UI.Page
{
static string x = "xxx";
string y = "yyy" + x;//这样错误,没法访问 

protected void Page_Load(object sender, EventArgs e)
{
string a = "aaa";
string b = "bbb" + a;//这样在方法体内就正确 

Response.Write(b);
Response.Write(y);
}
}
------解决方案--------------------
探讨
x , y 属于类字段,

c# 中字段的初始化先于构造函数。


一下纯属推论,未被证实

string y = "asdf" + x; 实际上是 y = "asdf" + this.x;

因为这时this还没被初始化,所以编译会报错。

------解决方案--------------------
看到了两个留言,加上12楼的朋友问起来,我就说说我的想法,都是个人见解。
不对的地方请见谅,水平有限。
探讨
引用:
public string x
{
get
{return "asdfasdfasdf"; }
}
public string y
{
get{return "asdf"+x;}
}


这 个是什么意思
为什么这样写
这样写有什么好处?

------解决方案--------------------
探讨
引用:
x , y 属于类字段,

c# 中字段的初始化先于构造函数。


一下纯属推论,未被证实

string y = "asdf" + x; 实际上是 y = "asdf" + this.x;

因为这时this还没被初始化,所以编译会报错。


this还没被初始化?this 是什么?不就是对象的首地址么?
如果对象还没被创建?那么字段存放在哪里?
既然对象已经创建,那么this不就已经确定?
呵呵

------解决方案--------------------
暂时抛开这个例子是否会被多次载入、使用不说
static string x = "asdfasdfasdf"; 
string y="asdf"+x;//这样是正确的为什么?
static成员变量是一个初始值设定的操作,不是一个赋值操作。第一个载入的人就开始设定了这个值。
这个例子为什么能够运行?
是因为static不需要借助任何对象,编译器不会为他加一个this指针。
问题2:
为什么this如此重要?
Public Class A
{
private int _myint;
public int Myint
{
get{}
set{}
}
A(){}
public void ss(int myint)
{
Myint=myint;
}
}
看看被编译器搞过的类
Public Class A
{
private int _myint;
public int Myint
{
get{}
set{}
}
A(){}
public void ss(int myint,(A *)this)//可以看看c++Mfc框架之类的书
{
this.Myint=myint;
}
}
为什么编译器会这么干?
A a1=new A();
A a2=new A();
a1.ss(1);
a2.ss(2);

看得出来,this是为了我们区分对象实例而来。

还是lz的例子,如果一个变量被赋值,这个this(对象),还没有实例化,this是无法使用的

1、static不属于任何一个对象。