C# 从C中的列表中获取引用/地址#

C# 从C中的列表中获取引用/地址#,c#,list,collections,reference,C#,List,Collections,Reference,我知道C#不处理指针,但我想知道,当我知道列表的第一个元素时,是否可以获得列表的引用? 例如: 假设我有一个定义为 List<T> abc 列出abc 如果我有abc[0],我可以得到abc的参考资料吗? 我是C#的新手,如果我的问题看起来很奇怪,我道歉。在C/C++中,我可以使用&abc[0]获得数组abc的地址。C#是否为我们提供了类似的工具,当我们知道集合中的一个项目时,它可以帮助我们返回集合本身? 谢谢,如果您正在设计集合中项目的类型,那么您可以向项目的类型中添加一个

我知道C#不处理指针,但我想知道,当我知道列表的第一个元素时,是否可以获得列表的引用? 例如: 假设我有一个定义为

List<T> abc  
列出abc
如果我有abc[0],我可以得到abc的参考资料吗? 我是C#的新手,如果我的问题看起来很奇怪,我道歉。在C/C++中,我可以使用&abc[0]获得数组abc的地址。C#是否为我们提供了类似的工具,当我们知道集合中的一个项目时,它可以帮助我们返回集合本身?
谢谢,

如果您正在设计集合中项目的类型,那么您可以向项目的类型中添加一个“指向”包含列表的属性;构造每个项目时,传入包含列表并将其保存在属性中

大概是这样的:

class ListItem
{
    public List<ListItem> Parent { get; set; }

    public ListItem(List<ListItem> parent)
    {
        Parent = parent;
    }
}

ListItem listItem = new ListItem(abc);
abc.Add(listItem);

// Get collection from item.
List<T> def = listItem.Parent;
public class List<T> : IList<T> blabla
{
    private T [] data;

    public T this[int index] { 
        get { return data[index]; } 
        set { data[index]=value; }
    }
    ... blabla
}
类列表项
{
公共列表父项{get;set;}
公共列表项(列表父项)
{
父母=父母;
}
}
ListItem ListItem=新的ListItem(abc);
添加(列表项);
//从项目中获取集合。
List def=listItem.Parent;

除非abc[0]的类型显式地包含对列表的引用,否则不会。事实上,在没有显式引用的情况下,C++中也不能做到这一点。p>

想想,在C++中,如果你可以期待<代码> FrestelePrt==ARARYPTR < /COD>,这是因为数组存储了这样的元素,它只对数组工作;其他一切都是偶然的


现在考虑任何指向第一个元素指针之前分配其他元素(可能是元素计数)的列表结构。您的假设将不再有效。

列表的定义有点像这样:

class ListItem
{
    public List<ListItem> Parent { get; set; }

    public ListItem(List<ListItem> parent)
    {
        Parent = parent;
    }
}

ListItem listItem = new ListItem(abc);
abc.Add(listItem);

// Get collection from item.
List<T> def = listItem.Parent;
public class List<T> : IList<T> blabla
{
    private T [] data;

    public T this[int index] { 
        get { return data[index]; } 
        set { data[index]=value; }
    }
    ... blabla
}
公共类列表:IList blabla
{
私有T[]数据;
公共T此[int索引]{
获取{返回数据[索引];}
set{data[index]=value;}
}
……废话
}
是的,它不是任何类型的链表。因此,您必须相应地使用它。虽然.NET值类型很小,类类型都是引用,但通常没有重数组复制操作,例如C++可能实现的,因此一般PUPRES集合的这种实现是足够好的(除非滥用)。从学术角度来看,Vector可能是一个更好的名字,但事实并非如此


您将无法获取对数据数组的引用,因为它是私有变量。你也不需要这个。若您需要枚举器,请显式使用GetEnumerator或隐式使用foreach

> P>集合在C语言中的工作方式与C++中的不一样,例如,可以将同一对象添加到多个不同的集合中,因此请求获取包含在其中的对象的列表是没有意义的,因为它可以在许多列表中(或没有,甚至在同一列表中多次)

这是Windows窗体为维护容器中的控件与包含这些控件的容器之间的关系所做的工作。显然,如果有人试图将同一对象添加到多个列表中,您应该决定该怎么做。

考虑:

unsafe static void Main() {
    int[] arr = new int[100];
    fixed(int* ptr = arr) {
        // ptr is a pointer to the zeroth item in the array

    }
}
然而,不安全代码在c#中并不常见,应该限制在性能关键的区域(甚至可以少用)。特别要注意的是,通过这样做,我们已经“固定”了阵列,并且注意,
ptr
仅在固定阵列时才可靠。在
fixed
块之外,GC可以自由重新定位阵列,从而使
ptr
无效


澄清:我不建议你这样做,但是:这样的事情是完全可能的。

我认为回答你的问题的一个大问题是:你想做什么?在C#中使用指针是可能的,但总的来说,完全没有必要,你能详细说明一下你想要实现的目标吗?我同意,虽然做你要求的事情是可能的,我怀疑你正在努力实现一个更大的目标——用不同的方式来看待这个问题可能会更容易一些。谢谢亚瑟研究我的问题。基本上,我有一个完整的列表,让我们称之为abc,def,ghi,jlk。。。。我有一个通用方法,它将触发另一个方法,该方法将根据我接收的元素所属的列表处理其中一个可用列表中的所有元素。@user1205746那么您应该直接传递应该处理的列表,而不是只传递该列表中的一项。如果出于其他原因需要,您也可以传递单个项。对于这个用例,我将定义自己的列表(使其成为框架的包装器),在添加时,我将订阅由添加项公开的事件,并触发外部侦听器将处理的我自己的事件。我希望你明白了。注意内存泄漏@AS-CII托管代码可能会“泄漏”内存(即,无意中使用开发人员打算发布的内存,实际上并非如此),但是此代码可能不属于该类别。谢谢,ShellShock。如何“指向”包含列表?这就是我一直在努力解决的问题。@user1205746您总是“指向”c#中的列表,因为它是一种引用类型。@Rotem:您能详细说明您的陈述“您总是指向列表”吗?我在集合中只有一个元素。我如何引用集合而不是引用项?我会认为.NET中的集合与C++的集合相同(其中列表= STD:vector和Link KistList= STD:list)。唯一的区别是,对于引用类型,只能有指针列表,std:vector行为仅适用于值类型。回答得好+1。@Justin:谢谢!所以,如果我理解正确的话,对象中是否有属性父对象供我们使用?不,不是。您必须声明一个带有父属性的类型。引用类型在变量中,在集合中也是一样,r