今天写了段这么的代码,类似
void create(object A)
{
A=new object;
}object A;
create(A);意思是create函数产生一个object类型变量,由A来引用。但是编译器说使用了未赋值的局部变量。很困惑,不能这样写么???
void create(object A)
{
A=new object;
}object A;
create(A);意思是create函数产生一个object类型变量,由A来引用。但是编译器说使用了未赋值的局部变量。很困惑,不能这样写么???
{
static void Main()
{
object A = null;
create(ref A);
} static void create(ref object A)
{
A = new object();
}
}
2. A是一个引用类型的对象,不论你声明方法 create(object A) 还是 create(ref object A),都是传递这个A。如果你去看非.net平台的什么c、c++的关于传值、传引用,完全是不一样的概念。在.net中,写ref反而会使得程序运行更慢一些,这个特点就可以说明问题。当你不写ref,那么方法create内部对A的赋值就不会从堆栈上赋值回调用方法之前的A变量。可以修改2楼的程序,来打印一下对象的HashCode看看class Program
{
static void Main()
{
object A = null;
Console.WriteLine(A.GetHashCode());
create(A);
Console.WriteLine(A.GetHashCode()); //可以看到这里并不是create方法内部设置的那个新对象
} static void create(object A)
{
A = new object();
Console.WriteLine(A.GetHashCode());
}
}
可以不加ref吗?? 传进去的不是引用吗?那改变的话,外面也会变吧~~~~
这种误解在从那些讲c、c++的书上学编程的人很普遍。学.net时千万不要拿那些东西来套用。A不是一个指针那么简单的东西,内部的赋值语句也不是往一个指针所指的的内存地址去写一个对象。
{
A=new object();
}object A=null;
create(A);
其实,就是理解【1】和【2】位置处的变量A,都叫同一个名字,是同一种类型,但不是同一个人。不知道是否明白。
再解释一下,就是【1】 和 【2】处A都是 object 类型,并且都叫名 A,但他们的内容不一样。
【1】处可以理解为空引用;
【2】处确实一个事实在在的object对象。再打个比方就是:在网络中,还有一个名字也叫 alonesword 的人在上网,虽然我和他(她)都是人类,都拥有相同的名号ID,而我们的思想、经历等都不一样(也许另一个 alonesword 是个MM也说不定,哈哈)
public static void RunSnippet()
{
object A【1】 = null;
create(A);
}
static void create(object A)
{
A = new object(); 【2】
}
ru