是否可以在不指定大小的情况下创建空数组?
例如,我创建了:
String[] a = new String[5];
Run Code Online (Sandbox Code Playgroud)
我们可以创建没有大小的上面的字符串数组吗?
假设您需要有一个需要经常迭代的整数列表/数组,我的意思是非常频繁.原因可能有所不同,但它说它是高容量处理的最内循环的核心.
通常,由于其大小的灵活性,人们会选择使用列表(列表).最重要的是,msdn文档声称列表在内部使用数组,并且应该执行速度快(使用Reflector快速查看确认这一点).不用说,有一些开销.
有没有人真正测量过这个?通过列表迭代6M次与阵列相同的时间?
每次我创建一个具有集合属性的对象时,我都会以最好的方式来回去做?
如果集合是一个数组(即objList.Clone())而不是List,它会有所不同吗?
如果返回实际集合作为引用是如此糟糕,因为它创建依赖项,那么为什么返回任何属性作为引用?每当您将子对象作为引用公开时,除非父级具有属性更改事件,否则可以在父级"知道"的情况下更改该子对象的内部.是否有内存泄漏的风险?
并且,不要选项2和3打破序列化?这是一个catch 22还是你必须在有集合属性的时候实现自定义序列化?
通用的ReadOnlyCollection似乎是一般用途的一个很好的折衷方案.它包装IList并限制对它的访问.也许这有助于内存泄漏和序列化.然而,它仍然有枚举问题
也许它只是取决于.如果您不关心集合是否被修改,那么只需将它作为公共访问器公开在每个#1的私有变量上.如果您不希望其他程序修改集合,那么#2和/或#3会更好.
问题隐含的是为什么一种方法应该用于另一种方法,以及对安全性,内存,序列化等的影响是什么?
谁能告诉我,哪一个是之间更有效的List<int>和int[].因为我正在研究一个项目,你可能知道效率是如此重要的关注点.
如果您在帖子中添加了一些介绍性说明,那就太棒了:)
我知道在.NET中,所有数组都派生自System.Array并且System.Array类实现IList,ICollection和IEnumerable.实际的数组类型也实现IList<T>,ICollection<T>和IEnumerable<T>.
这意味着如果你有一个String[],那么那个String[]对象也是a System.Collections.IList和a System.Collections.Generic.IList<String>;.
不难看出为什么那些IList会被认为是"ReadOnly",但令人惊讶的是......
String[] array = new String[0];
Console.WriteLine(((IList<String>)array).IsReadOnly); // True
Console.WriteLine(((IList)array).IsReadOnly); // False!
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,尝试通过Remove()和RemoveAt()方法删除项会导致NotSupportedException.这表明两个表达式都对应于ReadOnly列表,但IList的ReadOnly属性不返回预期值.
怎么会?
在.NET中,引用类型数组是共变体.这被认为是一个错误.但是,我不明白为什么这么糟糕考虑以下代码:
string[] strings = new []{"Hey there"};
object[] objects = strings;
objects[0] = new object();
Run Code Online (Sandbox Code Playgroud)
哦,这个编译并在运行时失败.当我们试图将一个对象粘贴到一个字符串[]中时.好的,我同意臭,但是T []扩展了Array并且还实现了IList(并且IList<T>,我想知道它是否实现了IList<BaseType> ......>.Array和IList都允许我们犯同样的可怕错误.
string[] strings = new []{"Hey there"};
Array objects = strings;
objects.SetValue(new object(),new[]{0});
Run Code Online (Sandbox Code Playgroud)
IList版本
string[] strings = new []{"Hey there"};
IList objects = strings;
objects[0] = new object();
Run Code Online (Sandbox Code Playgroud)
T []类由CLR生成,并且必须包含对set_Item方法等效的类型检查(数组实际上没有一个).
是否担心设置为T []必须在运行时进行类型检查(这违反了编译时期望的类型安全性)?当有相同的方法通过上面提供的手段射击自己的脚时,为什么它被认为有害于阵列显示这种属性?
这是一个后续问题: List <T> .Contains和T [].包含的行为不同
T[].ContainsT类和结构时表现不同.假设我有这个结构:
public struct Animal : IEquatable<Animal>
{
public string Name { get; set; }
public bool Equals(Animal other) //<- he is the man
{
return Name == other.Name;
}
public override bool Equals(object obj)
{
return Equals((Animal)obj);
}
public override int GetHashCode()
{
return Name == null ? 0 : Name.GetHashCode();
}
}
var animals = new[] { new Animal { Name = "Fred" } };
animals.Contains(new Animal { Name = …Run Code Online (Sandbox Code Playgroud) 如何在列表和数组中定义索引器.
List<MyStruct> lists=new List<MyStruct>();MyStruct结构在哪里.现在考虑一下
MyStruct[] arr=new MyStruct[10];
arr[0]给出了第一个Structure项的引用.但是lists[0]给了我一份它的副本.是否有任何理由这样做.此外,由于Int32结构是List<Int32> list1 =new List<Int32>();如何可以访问list1[0]或分配list1[0]=5在不可能的地方lists[0]._x=5
c# ×7
arrays ×6
.net ×4
generics ×3
list ×3
architecture ×1
equals ×1
performance ×1
struct ×1
value-type ×1