代码如下:
class Entry
{  
   public Entry next;
   int data;
public Entry(Entry top,int data)
 {
    this.next=top;
    this.data=data; }}
class test
{
private Entry top;
public void push(int data)
   {
    // new Entry(top,data);  代码1
    // top=new Entry(top,data)  代码2
   }}
请大家讨论下为什么代码1会抛出警告: 从未对test.top字段赋值,字段将保持默认值.
而代码2不会?
第一次push操作后, test类里面会包含两个Entry对象吧 ? 那产生的第1个对象是何时初始化的? 
Entry类的构造函数已重写为带参数的构造函数, 那第一个Entry对象是如何使用无参构造函数初始化的?

解决方案 »

  1.   

    top=new   Entry(top,data)  看见这个"=",明显知道已经对top赋值了.至于代码1,我不懂怎么描述
      

  2.   

    个人理解:
    代码2实例化了一个Entry对象并将私有成员top指向了这个实例
    相当于Entry top  =  new  Entry(top,data);
    而代码1
    尽管也实例化了一个对象(这语法……有问题吧?没试)
    但是并未将top指向这个实例,所以说提示未赋值吧
    ps:怎么有点递归的感觉,晦涩啊,搅的头晕
      

  3.   


    简单的说是编译检测与运行时
    top=new   Entry(top,data)     代码2
    有对top赋值(编译时的),而不是Entry(top)初次使用的没赋值检查(运行时的)-----个人理解
      

  4.   

    很简单...class   test 

    private   Entry   top; //未赋值
    public   void   push(int   data)
          {
            //   new   Entry(top,data);     代码1  //匿名对象...此处top作为参数由上可知未赋值...
            //   top=new   Entry(top,data)     代码2 //不用解释了吧...
          }
    }你的问题在于...代码一片混乱...所以容易迷惑...
      

  5.   

    其实这个问题,跟第一行代码没什么关系,编译器只是告诉你,该成员变量在目前的代码内没有被赋值而已如果你的代码是这样的class   test 

    private   Entry   top; 
    public   void   push(int   data) 
          { 
          } public Entry pop()
    {
     return top;
    }} 你会得到同样的警告
      

  6.   

    代码1应该无意义啊。而且top此时为null,警告是提醒你以null进行初始化。
      

  7.   

    编译器警告(等级 4)CS0649 : 从未对字段“field”赋值,字段将一直保持其默认值“value”编译器检测到未初始化且从未被赋值的私有字段声明或内部字段声明时生成此警告。只要明确赋值就不会产生此警告.所以第一种形式: new   Entry(top,data);     将产生此警告解决办法很多...赋值即可:1, 声明时候 private   Entry   top  = null; 
    2, 在构造函数中赋值public test()
    {
       top  = null; 
    }3,使用之前top = null;
    new   Entry(top,data);     4,使用之后new   Entry(top,data);     
    top = null;5,在其他方法中赋值
    public   void   push(int   data) 
    {
    new   Entry(top,data);  
    }
     
    void f()
    {  
       top = null;
    }
    总之,明确赋值之后就不会出现此警告.但这只是警告..不是错误.
      

  8.   

    首先感谢各位的解答,
    不过看来是表述的关系,居然没有人回答到重点. 下面再重新描述下问题:using System;
    namespace Acme.Collections
    {
    public class Stack
    {
    Entry top;
    public void Push(object data) {
    top = new Entry(top, data); //注意此处     代码1
    }
    public object Pop() {
    if (top == null) throw new InvalidOperationException();
    object result = top.data;
    top = top.next;
    return result;
    }
    class Entry
    {
    public Entry next;
    public object data;
    public Entry(Entry next, object data) {
    this.next = next;
    this.data = data;
    }
    }
    }
    }以上是C#语言规范中的示例代码, 大家注意代码1. 
    问题: 
    在第一次执行push操作后, Stack对象中会包括几个Entry对象?  这几个Entry对象产生的具体过程是怎样?
      

  9.   

    第一次push后只有一个Entrytop = new Entry(top, data);  因为是值传递,top作为参数第一次传递的时候是null,返回实例top. 
      

  10.   

    该问题实际是个内存问题, 注意每次new的时候 top的指向,画画内存图应该就知道了