一个超简单的问题,自认为高手的进来!!!!!!!!!!!!!!!!
今天上午遇到一个问题,超郁闷。自己写了一个类,类里一个方法,用来获得数据。我在类里声明了两个字段,结果一直提示“字段初始值设定项无法引用非静态字段、方法或属性”,而在方法体内声明同样类型的两个字段,就正确。希望高手们从理论上好好解释一下!我声明的类示例如下:
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:你好长时间前的帖子还没有结;
[解决办法]
[解决办法]
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);
}
}
[解决办法]
[解决办法]
看到了两个留言,加上12楼的朋友问起来,我就说说我的想法,都是个人见解。
不对的地方请见谅,水平有限。
[解决办法]
[解决办法]
暂时抛开这个例子是否会被多次载入、使用不说
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不属于任何一个对象。
2、x无法使用的原因就是,this(对象)还没有初始化,所以x不能用来赋值
[解决办法]
[解决办法]
我说的用属性没有问题,并不是说成员用属性初始化
而是说属性用属性初始化没有问题……
[解决办法]
呵呵,这个和lz的问题是没有“直接”关系,但如果了解字段初始化和构造函数会是怎么编译的,
就知道“x无法使用的原因就是,this(对象)还没有初始化,所以x不能用来赋值 ”这个是错的了。
---------------------------------------------
为了证明我的观点,给出一个模型,水平有限,如果认为不对,请给出自己的模型。
以lz例子为例:
string x = "asdfasdfasdf";
string y="asdf";//这个x被我去掉了,否则不能编译。
模型如下:
this -> 1、page_load()
x 2、其他方法和函数
y
------------------------
假设我给出的模型成立,在初始构造的时候。this,x,y都是需要初始化的。
这也是为什么我反复说明这个类是3*4 Int 空间的说法。