大家好!
请问大家一个问题。
如下:
程序如下:
namespace ConsoleApplication9
{
    class Program
    {
        static void Main(string[] args)
        {
            Program add = new Program();
            Class2 b = new Class2();
            Console.WriteLine(b.getadd());
        }
    }
}namespace ConsoleApplication9
{
    class Class1
    {
    }
}namespace ConsoleApplication9
{
    class Class2
    {
        Class1 a;
        public object getadd()
        {
            return a;
        }    }
}我想验证,在声名一个对象,但没有初始化的情况下,其值为NULL。
此程序执行结果确实为空。
但是这个程序事实上并不能反映我想验证的情况。
因为在class2上声名class1之后,主函数在调用的时候,class2会执行系统默认的构造函数,事实上还是初始化了。若我在主函数中声名class1,会提示使用了未赋值的局部变量。
如下:
namespace ConsoleApplication9
{
    class Program
    {
        static void Main(string[] args)
        {
            Class1 a;
            Console.WriteLine(a);
            //Program add = new Program();
            //Class2 b = new Class2();
            //Console.WriteLine(b.getadd());
        }
    }
}
有如下疑问:
按照堆栈的原理:程序从主函数开始执,首先放入栈的是Main(string[] args),然后执行主函数体内的
指令,接下来放入栈中的就是我声名的对象a,但我没有初始化a,这是在栈中的a point不指向任何堆中的引用类型。
那他的值就应该是NULL。那么在执行第二段代码时,是
我声名的对象a确实已放入栈中,并且其值为NULL,只是因为系统对主函数的规定,必须对变量赋初值后才能使用,所以才报错,还是说因为没有对a赋初值,我声名的a根本就没有放入栈中?
换句话说,我想知道,对于我的第二段代码,是不是其它a已经放入栈中其值确实为null,报错的原因只是因为系统对主函数的
规定(必须初始化)。以上是主要问题。另外,在这个验证过程中,还遇到了另一个问题,希望大家帮忙解答:在第一段代码中,输出a的值(指针值),我直接Console.WriteLine(b.getadd());若我想用一个变量来接收,
那我应该将此变量声名为什么时候类型呢?注:经验证
namespace ConsoleApplication10
{
    class Program
    {
        static void Main(string[] args)
        {
            string k;
            Class1 a = new Class1();
            k = a.ToString();
            Console.WriteLine(k);
        }
    }
}
可以将a转换为字符串类型。输出结果为ConsoleApplication10.class1。
console.writeline(a.gettype());输出结果也是ConsoleApplication10.class1。
这个ConsoleApplication10.class1到底是什么类型,我声名什么类型变量,才能接收引用?
另外还有一个:我们常说的类的实例化。这个“实例化”指什么?是class1 a=new class(),还是说class1 a;这一步其实就是实例化了。我是一个初学者,谢谢大家的帮助。

解决方案 »

  1.   

    class1 a=new class()是实例化
    class1 a 是声明一个class1类型的变量但是没有指向任何对象,这种情况写在函数内部是编译错误的。
    但是在类中

    class Class2
      {
      Class1 a;
      public object getadd()
      {
      return a;
      }a会自动赋值成null;因此上面的Class2等于
    class Class2
      {
      Class1 a = null;
      public object getadd()
      {
      return a;
      }
    因此你的第一个程序
    namespace ConsoleApplication9
    {
      class Program
      {
      static void Main(string[] args)
      {
      Program add = new Program();
      Class2 b = new Class2();
      Console.WriteLine(b.getadd());
      }
      }
    }namespace ConsoleApplication9
    {
      class Class1
      {
      }
    }namespace ConsoleApplication9
    {
      class Class2
      {
      Class1 a;
      public object getadd()
      {
      return a;
      }  }
    }
    main中的
    Class2 b = new Class2();
    b.getadd()结果是null
      

  2.   

    另外
    ToString是Object的一个Virtual的函数。
    如果你不override它,它的默认实现就是返回类的full name. 
    full name就是namespace.classname.参考
    http://msdn.microsoft.com/zh-cn/library/system.object.tostring(v=vs.80).aspx
      

  3.   


    您好,谢谢您的回答。也就是说k = a.ToString();  Console.WriteLine(k);返回的只是a的full name并不是其地址。其实我是想返回a的值,a是个引用,那就是说栈中a存放的是一个地址。
    我想把他的地址输出,该怎么做呢。另外:
    在第一段代码中 Console.WriteLine(b.getadd());其中getadd()方法中,我直接return a;并没有tostring的过程,那他返回的应该是我想要的址吧,因为我不知道地址我该用什么类形的变量,所以用了object。在主函数输出,也就是Console.WriteLine(b.getadd());也没有用tostring。那这输出的是地址吗?或者又是不是Console.WriteLine(b.getadd());自动对参数有tostring的隐式转换。那这种情况下输出的其实还是full name。总结下:其实有两个问题,1.怎么样可以输出一个栈中的引用。2.对于引用,我用什么类型的变量来接收。谢谢!