首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

一个超简单的有关问题,自认为高手的进来!

2012-01-19 
一个超简单的问题,自认为高手的进来!!!!!!!!!!!!!!!!今天上午遇到一个问题,超郁闷。自己写了一个类,类里一

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

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 空间的说法。

热点排行