相关疑难解决方法(0)

数组与List <T>:何时使用哪个?

MyClass[] array;
List<MyClass> list;
Run Code Online (Sandbox Code Playgroud)

当一个优于另一个时,有什么情况?为什么?

.net arrays list

561
推荐指数
7
解决办法
28万
查看次数

如何在C#中初始化一个空数组?

是否可以在不指定大小的情况下创建空数组?

例如,我创建了:

String[] a = new String[5];
Run Code Online (Sandbox Code Playgroud)

我们可以创建没有大小的上面的字符串数组吗?

c# arrays initialization

299
推荐指数
8
解决办法
49万
查看次数

阵列与列表的性能

假设您需要有一个需要经常迭代的整数列表/数组,我的意思是非常频繁.原因可能有所不同,但它说它是高容量处理的最内循环的核心.

通常,由于其大小的灵活性,人们会选择使用列表(列表).最重要的是,msdn文档声称列表在内部使用数组,并且应该执行速度快(使用Reflector快速查看确认这一点).不用说,有一些开销.

有没有人真正测量过这个?通过列表迭代6M次与阵列相同的时间?

.net arrays generics performance list

181
推荐指数
5
解决办法
15万
查看次数

如何公开集合属性?

每次我创建一个具有集合属性的对象时,我都会以最好的方式来回去做?

  1. 带有getter的公共属性,它返回对私有变量的引用
  2. 显式get_ObjList和set_ObjList方法,每次返回并创建新的或克隆的对象
  3. 显式get_ObjList返回一个IEnumerator和一个带有IEnumerator的set_ObjList

如果集合是一个数组(即objList.Clone())而不是List,它会有所不同吗?

如果返回实际集合作为引用是如此糟糕,因为它创建依赖项,那么为什么返回任何属性作为引用?每当您将子对象作为引用公开时,除非父级具有属性更改事件,否则可以在父级"知道"的情况下更改该子对象的内部.是否有内存泄漏的风险?

并且,不要选项2和3打破序列化?这是一个catch 22还是你必须在有集合属性的时候实现自定义序列化?

通用的ReadOnlyCollection似乎是一般用途的一个很好的折衷方案.它包装IList并限制对它的访问.也许这有助于内存泄漏和序列化.然而,它仍然有枚举问题

也许它只是取决于.如果您不关心集合是否被修改,那么只需将它作为公共访问器公开在每个#1的私有变量上.如果您不希望其他程序修改集合,那么#2和/或#3会更好.

问题隐含的是为什么一种方法应该用于另一种方法,以及对安全性,内存,序列化等的影响是什么?

.net c# architecture

48
推荐指数
1
解决办法
2万
查看次数

哪一个更有效:List <int>或int []

谁能告诉我,哪一个是之间更有效的List<int>int[].因为我正在研究一个项目,你可能知道效率是如此重要的关注点.

如果您在帖子中添加了一些介绍性说明,那就太棒了:)

c# list

27
推荐指数
5
解决办法
2万
查看次数

为什么((IList <T>)数组).ReadOnly = True但是((IList)数组).ReadOnly = False?

我知道在.NET中,所有数组都派生自System.Array并且System.Array类实现IList,ICollectionIEnumerable.实际的数组类型也实现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 c# arrays generics

21
推荐指数
2
解决办法
1339
查看次数

为什么阵列协方差被认为是如此可怕?

在.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 []必须在运行时进行类型检查(这违反了编译时期望的类型安全性)?当有相同的方法通过上面提供的手段射击自己的脚时,为什么它被认为有害于阵列显示这种属性?

c# arrays

14
推荐指数
2
解决办法
2211
查看次数

T [].包含struct和class的行为方式不同

这是一个后续问题: 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)

c# arrays generics struct equals

12
推荐指数
1
解决办法
309
查看次数

列表与数组中的索引器

如何在列表和数组中定义索引器.

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# value-type

10
推荐指数
2
解决办法
9806
查看次数