一个超简单的问题,自认为高手的进来!!!!!!!!!!!!!!!!今天上午遇到一个问题,超郁闷。自己写了一个类,类里一
一个超简单的问题,自认为高手的进来!!!!!!!!!!!!!!!! 今天上午遇到一个问题,超郁闷。自己写了一个类,类里一个方法,用来获得数据。我在类里声明了两个字段,结果一直提示“字段初始值设定项无法引用非静态字段、方法或属性”,而在方法体内声明同样类型的两个字段,就正确。希望高手们从理论上好好解释一下!我声明的类示例如下: 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不属于任何一个对象。
2、x无法使用的原因就是,this(对象)还没有初始化,所以x不能用来赋值[解决办法]
探讨 所以用属性是没有问题的,用lz的成员那种赋值方式当然是存在问题的。 错,一样不能用实例属性。 ---------------------------- 还想问一下,不产生实例是如何调用属性的? 请写一下不产生实例,但是能调用属性的例子吧[解决办法] 我说的用属性没有问题,并不是说成员用属性初始化
而是说属性用属性初始化没有问题……
探讨 引用: 看你们争论,真是汗,为什么一定要拿属性和成员比较? 属性和成员根本不是一回事 相反,属性倒是和方法差不多 一个属性相当于封装了2个方法,一个get,一个set 属性可以访问成员,也可以不访问成员 所以用属性是没有问题的,用lz的成员那种赋值方式当然是存在问题的。 因为实例在初始化时,哪个成员先初始化,哪个后初始化,这个是不能确定的 所以用属性是没有问题的,用lz的成员…[解决办法] 呵呵,这个和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 空间的说法。