大家好!
请问大家一个问题。
如下:
程序如下:
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;这一步其实就是实例化了。我是一个初学者,谢谢大家的帮助。
请问大家一个问题。
如下:
程序如下:
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;这一步其实就是实例化了。我是一个初学者,谢谢大家的帮助。
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
ToString是Object的一个Virtual的函数。
如果你不override它,它的默认实现就是返回类的full name.
full name就是namespace.classname.参考
http://msdn.microsoft.com/zh-cn/library/system.object.tostring(v=vs.80).aspx
您好,谢谢您的回答。也就是说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.对于引用,我用什么类型的变量来接收。谢谢!