解决方案 »
- 又来求问了,自学C#不知道怎么操作数据库
- 创建用户控件失败
- OWC画折线图 如何去掉第一段折线?如下图所示的效果
- 急求有关gridview数据保存成文件的解决办法!!
- Console类与Convert类
- 请教各位大侠:想连接远程的sql数据库,带用户名和密码的,怎么写连接代码?谢了!
- VS2005水晶报表中IFieldObject的问题
- 急,怎么定义列表框控件的SelectedItems属性
- 请教高手,如何用c语言把pdf写入计算机内存,提提建议都可以
- xtrareport 这个错误怎么解决?
- 请问如何实现调用另一个类中实现的接口
- C#正则表达式,为什么我替换他本身替换不干净啊?用正则表达式测试工具测过,表达式没有问题啊!
int** pp=malloc(32);
int * p;
for(int i=0;i<8;i++)
{
p= malloc(4);
pp[i]=p;
}是一样的
方法二只在循环外为emp分配一次空间,它虽然每次循环引用不同的对象,引用的对象变了,但本身始终不变,只能引用一个对象,所以add方法每次都把上次的对象替换掉了,最终只加入了一个对象。
不知道理解的对不对。
不知道理解的对不对。还是每次都在堆中为新的emp分配空间,for栈中的emp还是不断指向堆中新创建的emp的地址,add还是在一个Int32[]中添加了一个Int32,每次add时,emp所指向堆中的地址都是不同的所以,你代码出错,100%是你不透露代码产生的原因
我感觉这两种方式应该都是正确的,并且这两种方式占用的堆空间应该相当,相比之下在大部分情况下第二种占用的栈空间可能更少。分析原因如下:
第一种方法:再循环体内,每次每次执行在线程堆栈中分配一个保存Employee对象引用的变量和在托管堆中分配一个Employee对象,接着将托管堆中对象的引用存放在employees中,知道该方法完成。所以所有Employee对象将得以保存。但此时线程堆栈中应该有了若干个保存Employee对象引用的变量。
而第二种方案,在循环体外部定义了保存Employee对象引用的变量,使得该方法内部仅有一个该线程堆栈变量。在循环体内部,每次在托管堆中定义一个Employee对象,并将其引用存于所定义的变量引用中(注意每次返回的变量引用是不相同的),最后将引用保存在employees抽象数据结构中。这里要说明的是,不管在循环执行到什么时候,先前生成的对象并不会被回收,这有GC的特性决定的,因为先前声明的变量可通过应用程序的跟连接到,是可达对象图中的一部分。
两种方式应该都是正确的,并且这两种方式占用的堆空间应该相当,相比之下在大部分情况下第二种占用的栈空间可能更少。第二中方法我得到了验证,不会出现楼主所说的方法二的employees好象只能add成功最后一个emp问题。
emp是引用类型,绝对不会在栈里分配,应该在托管堆中分配内存地址。
而且只能有一个该类的实例。
无论哪个方法,都会把for块中new出来的Employee加入到List中谁要是能写出让List不断的Add,只加入了最后一次new出来的Employee,那可就真是神人了
你说错了,,看来你2颗星白拿了,,,你还不明白什么叫 引用类型么?emp 按照LZ说的分析 emp 是一个引用类型 他存放的是 地址 而不是值
你new 100次 也只是说那个地址里的值变了 地址没变而你每次list.add 加的都是地址 而不是值 所以值就是最后一次加的
而同一地址被加了无数次好比你家就是 emp 就是你家的地址,,你买了多少菜回去 都是放在你家
因为他定义的emp 在for 外面 所以自始至终没有new 一个真正的地址出来
而是不断的new 新的值 往旧地址里放
如果引用类型 值类型 搞不明白,,那非常遗憾,,你的代码真的可能会乱的一塌糊涂
方法一和方法二的employeesList结果应该是一样的。
不同点:
1、第一个方法的emp 在循坏外不可访问,而第二个方法的emp在循环结束后保存最后一个employees的引用。
2、第一个方法每次声明一个employees类型的指针,该指针指向了一个新的employees对象。
第二个方法只声明一个employees类型的指针,每次循环修改该指针的值指向了一个新的employees对象。
无论是值类型还是引用类型,局部变量的地址都是不会改变的,但你扔到集合中的不是变量的地址,而是变量的地址中所存放的值,对于Int类型,变量的地址存放值的是变量的值,对于class变量的地址存放的是class在堆中的地址
public class Node
{
int _id;
int _parentId;
IList<Node> _li = null;
public Node(int id, int parentId)
{
_li = new List<Node>();
_id = id;
_parentId = parentId;
}
public int Id { get { return _id; } }
public int ParentId { get { return _parentId; } }
public IList<Node> Children { get { return _li; } set { _li = value; } }
public void AddNode(Node _n)
{
if (null != _n)
_li.Add(_n);
}
} IList<Node> _l = new List<Node>();
for (var i = 0; i < 10; i++)
{
Node _n = new Node(i, i + 1);
_l.Add(_n);
}
var m = 0;
foreach (var _n in _l)
{
m++;
Console.WriteLine(m.ToString() + ":" + _n.Id.ToString());
} Console.WriteLine("======================");
IList<Node> _ll = new List<Node>();
Node _p;
for (var i = 0; i < 10; i++)
{
_p = new Node(i, i + 1);
_ll.Add(_p);
}
var n = 0;
foreach (var _n in _l)
{
n++;
Console.WriteLine(n.ToString() + ":" + _n.Id.ToString());
} Console.Read();
for (var i = 0; i < 10; i++)
{
Node _n = new Node(i, i + 1);
_l.Add(_n);
}
var m = 0;
foreach (var _n in _l)
{
m++;
Console.WriteLine(m.ToString() + ":" + _n.Id.ToString());
} Console.WriteLine("======================");
IList<Node> _ll = new List<Node>();
Node _p;
for (var i = 0; i < 10; i++)
{
_p = new Node(i, i + 1);
_ll.Add(_p);
}
var n = 0;
foreach (var _n in _ll)
{
n++;
Console.WriteLine(n.ToString() + ":" + _n.Id.ToString());
} Console.Read();
{
static void Main(string[] args)
{
List<Dog> dogs = new List<Dog>();
Dog dog;
for(int i=0;i<10;++i)
{
dog = new Dog("dog "+i.ToString());
dogs.Add(dog);
}
foreach (Dog d in dogs)
{
Console.WriteLine(d.name);
}
}
} class Dog
{
public Dog()
{
}
public Dog(string name)
{
this.name = name;
}
public string name;
}
lz的代码不会出现lz所说的问题,lz还是仔细检查一下代码是不是贴错了
如果非要找出什么的话
List<Employee> employees = new List<Employee>();
Employee emp = new Employee();
for(...)
{employees.add(emp);
}
只有这样。employees中的emp才是会指向同一个。
如果不是这样的话,那就是楼主的中间代码有问题了
{
private string name; public string Name
{
get { return name; }
set { name = value; }
}
} class Program
{
static void Main(string[] args)
{
List<Employee> emp = new List<Employee>(); Employee employee; for (int i = 0; i < 10; i++)
{
employee = new Employee();
employee.Name = i.ToString(); emp.Add(employee);
} foreach (Employee temp in emp)
{
Console.WriteLine(temp.Name);
} Console.ReadLine(); }
}没有发现你说的问题。