using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace test4
{
class Program
{
public class pepole
{ public string Name {get;set;}
public pepole(string n)
{ this.Name=n;}
}
static void Main(string[] args)
{
//问题1:
{
pepole Jim = new pepole("Jim");
Console.WriteLine(Jim.Name);
}//Jim 对象 在此处 结束生命 //如果这里调用 Console.WriteLine(Jim.Name); 则报错
//我想问问 如何骗过 C# 的垃圾收集器,不对Jim 对象的释放,而我想手动释放。(仅对Jim对象) //问题1: {
pepole Jim = new pepole("Jim");
Console.WriteLine(Jim.Name);
//如何在这里 释放 Jim 对象 //使得下面的
//Console.WriteLine(Jim.Name); 会报错呢
}//Jim 对象 在此处 结束生命
Console.ReadKey();
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace test4
{
class Program
{
public class pepole
{ public string Name {get;set;}
public pepole(string n)
{ this.Name=n;}
}
static void Main(string[] args)
{
//问题1:
{
pepole Jim = new pepole("Jim");
Console.WriteLine(Jim.Name);
}//Jim 对象 在此处 结束生命 //如果这里调用 Console.WriteLine(Jim.Name); 则报错
//我想问问 如何骗过 C# 的垃圾收集器,不对Jim 对象的释放,而我想手动释放。(仅对Jim对象) //问题1: {
pepole Jim = new pepole("Jim");
Console.WriteLine(Jim.Name);
//如何在这里 释放 Jim 对象 //使得下面的
//Console.WriteLine(Jim.Name); 会报错呢
}//Jim 对象 在此处 结束生命
Console.ReadKey();
}
}
}
回1楼
我是 想动态搞链表!
不知怎样吧链表中间的一个节点DEL 了(老是出错,不是垃圾收集器把我的对象给释放了,就是只能静态声明,就像你说的那样,“把它声明在Main外”但这样可能会冲暴内存啊!)会得一定要支持一下啊----动态链表
下面是我的源代码,会的就点醒我吧!!!
谢谢啦! //C# Code//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Collections; namespace test2
{
public class person //测试用
{ public string Name { set; get; } }
class Program
{
static void Main(string[] args)
{
person p1 = new person();
p1.Name = "jim";
LinkedList MyList = new LinkedList();
MyList.AddLast(1);
MyList.AddLast("2");
MyList.AddLast(p1);
ListToScreen(MyList); //输出
MyList.AddLast("Add");
MyList.AddLast(1000);
ListToScreen(MyList); //输出 MyList.PopLast(); //弹出一个元素
ListToScreen(MyList); //输出
Console.ReadKey();
}
//---- 输出到LinkedList 所有元素屏幕的 ----
static void ListToScreen(LinkedList ll)
{
StringBuilder PutOut = new StringBuilder(); //输出到屏幕的String
foreach( var ob in ll )
{
if( ob is string )
{
PutOut.Append(ob);
}
if( ob is person )
{
PutOut.Append(((person)ob).Name);
}
if( ob is int )
{
PutOut.Append(ob.ToString());
}
PutOut.Append("\t");
}
Console.WriteLine(PutOut);//执行输出
}
}
//定义数据节点1法
public class LinkedListNode
{
private object value; //data
public LinkedListNode(object value) //构造
{
this.value = value;
}
public object Value
{
get { return value; }
}
private LinkedListNode next;
public LinkedListNode Next
{
get { return next; }
internal set { next = value; }
}
private LinkedListNode prev;
public LinkedListNode Prev
{
get { return prev; }
internal set { prev = value; }
}
LinkedListNode()
{
this.prev = this.next = null;
}
}
//定义链表 管理器
public class LinkedList: IEnumerable
{
private LinkedListNode current; //本链尾节点
private LinkedListNode first; //头节点
public LinkedListNode First
{
get { return first; }
}
private LinkedListNode last; //本链尾节点
public LinkedListNode Last
{
get { return last; }
}
public bool CurrentMoveUp() //当前节点上移
{
if( current == first )
{
return false;
}
else
{
current = current.Prev;
}
return true;
}
public bool CurrentMoveDown() //当前节点下移
{
if( current == last )
{
return false;
}
else
{
current = current.Next;
}
return true;
}
public LinkedListNode AddLast(object node)//增加节点 -- 到最后
{
LinkedListNode newNode = new LinkedListNode(node);
if( first == null ) //
{
first = newNode;
last = first;
current = first;
}
else
{
this.last.Next = newNode; // 链尾 连新结
this.last = newNode; // 链尾 重置
}
return newNode;
}
public LinkedListNode PopLast() //取得最后一个节点,并且LinkedList 不去控制它
{
if( first == null )
{
return null;
}
else
{
LinkedListNode returnNode = last; // 拿到链尾
last = last.Prev; // 链尾 前移
last.Next = null; // 链尾 打结 ///运行到这出错,谁知道为什么!!
return returnNode;
}
}
//还没有增加删除方法
public IEnumerator GetEnumerator() //专为 foreach 服务的
{
LinkedListNode current = first;//头节点
while( current != null )
{
yield return current.Value;
current = current.Next;
}
}
}
}
这个是解决办法之一
else
{
this.last.Next = newNode; // 链尾 连新结
newNode.Prev = this.last;//你添加新节点是没有设置前面的节点,( last = last.Prev; )导致last为null,你在调用last.Next肯定出问题
this.last = newNode; // 链尾 重置
}
可以利用重写添加元素的ToString()
foreach (var ob in ll)
{
PutOut.Append(ob+"\t");
} Console.WriteLine(PutOut); public class person //测试用
{
public string Name { set; get; }
public override string ToString()
{
return this.Name;
}
}
你写的非常好,我能看明白你要表达的意思,
能让我体会到 重写ToString() 的好处,
但是我还是不知到如何 删除链表的节点,(不是间单的剪短,连上,我想释放掉剪掉那段 的内存)。
比如下面的不知能不能展示一下你是
如何写PopLast()方法?//PopLast--弹出最后一个节点,并删除它!
[color=#80D00]现在正苦于写不出链表的删除方法![/color]
不能在后面访问Jim的原因是因为那里已经超出Jim这个变量(而不是对象)的作用域了,而不是Jim指向的对象被回收了什么的。你后面贴的那个代码
public LinkedListNode AddLast(object node)//增加节点 -- 到最后
{
LinkedListNode newNode = new LinkedListNode(node);
if( first == null ) //
{
first = newNode;
last = first;
current = first;
}
else
{
newNode.Prev=this.last; //少了这一句
this.last.Next = newNode; // 链尾 连新结
this.last = newNode; // 链尾 重置
}
return newNode;
}
添加新节点时你没有设置它的Prev属性,所以后面你last = last.Prev;的时候实际把last设为null了,然后last.Next自然会出错
你没有设置新节点的Prev属性,后面删除的时候你设置last=returnv
本人从C语言走来到.net 的 对.net 提供的方法有太多太多的不懂。
看到.net 提供的功能 难免会用C 的思维来分析它的实现原理,我也正想选打通链表再到树,矩形等数据结构, 由些深信不会数据结构写出项目必定困难重重。
加上我能力有限,到现在还搞不清接口是怎么回事。
特别是C++ 到C# 的继承方面,C#的类就没法同时继承两个类,没法保护继承等.自从接触.net 以来就没有 真正的深想编程的原理,逻辑和实现的可行性,代价(发时间多少),老是被它提供的方法搞得团团转,(不是Npoi 就是asp。net内的各种传参问题,特别是ListView)
你说我这种学习法方正常吗?
过来人支支招,谢谢啦!!