ArrayList array1 = new ArrayList();
array1.Add(1);
array1.Add("Pony"); //No error at compile process
int total = 0;
foreach (int num in array1)
{
total += num; //-->Runtime Error
}
如果您使用 List ,则可以避免这些错误:
List<int> list1 = new List<int>();
list1.Add(1);
//list1.Add("Pony"); //<-- Error at compile process
int total = 0;
foreach (int num in list1 )
{
total += num;
}
var arraylist = new ArrayList();
var arrayListSyncronized = ArrayList.Synchronized(arraylist
Console.WriteLine($"syncronized {arraylist.IsSynchronized}");
Console.WriteLine($"syncronized {arrayListSyncronized.IsSynchronized}");
var list = new List<object>();
var listSyncronized = ArrayList.Synchronized(list);
Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
ArrayList myCollection = new ArrayList();
lock(myCollection.SyncRoot) // ofcourse you can use another object for this goal
{
foreach (object item in myCollection)
{
// ...
}
}
2
使用“列表”可以防止出现错误 . 避免运行时转换错误非常有用 .
例:
在这里(使用ArrayList),您可以编译此代码但是稍后您会看到执行错误 .
// Create a new ArrayList
System.Collections.ArrayList mixedList = new System.Collections.ArrayList();
// Add some numbers to the list
mixedList.Add(7);
mixedList.Add(21);
// Add some strings to the list
mixedList.Add("Hello");
mixedList.Add("This is going to be a problem");
System.Collections.ArrayList intList = new System.Collections.ArrayList();
System.Collections.ArrayList strList = new System.Collections.ArrayList();
foreach (object obj in mixedList)
{
if (obj.GetType().Equals(typeof(int)))
{
intList.Add(obj);
}
else if (obj.GetType().Equals(typeof(string)))
{
strList.Add(obj);
}
else
{
// error.
}
}
3
对我来说,了解你的数据 . 如果我继续在效率的基础上扩展我的代码,我将不得不选择List选项作为解密我的数据的方式,而不是总是想知道类型的不必要的步骤,尤其是“自定义类型” . 如果机器了解差异并且可以确定我实际处理的是什么类型的数据,那么为什么我要阻止并且浪费时间通过“IF THEN ELSE”确定的回转?我的理念是让机器为我而不是我在机器上工作?了解不同目标代码命令的独特差异对于使代码高效有很长的路要走 .
11 回答
是的,差不多 .
List<T>
是一个通用类 . 它支持存储特定类型的值而无需转换为object
(当T
是ArrayList
情况下的值类型时,会产生装箱/拆箱开销) .ArrayList
只存储object
引用 . 作为通用集合,List<T>
实现了通用IEnumerable<T>
接口,可以在LINQ中轻松使用(无需任何Cast
或OfType
调用) .ArrayList
属于C#不赞成't have generics. It'的日子,赞成List<T>
. 您不应该在面向.NET> = 2.0的新代码中使用ArrayList
,除非您必须与使用它的旧API进行交互 .使用
List<T>
可以防止出现错误 . 避免运行时转换错误非常有用 .例:
在这里(使用
ArrayList
)您可以编译此代码,但稍后您将看到执行错误 .如果您使用
List
,则可以避免这些错误:参考:MSDN
添加到上述几点 . 在64位操作系统中使用
ArrayList
比在32位操作系统中使用的内存少2倍 . 同时,通用列表List<T>
将使用比ArrayList
低很多的内存 .例如,如果我们在32位中使用19MB的
ArrayList
,则在64位中需要39MB . 但是如果你有一个32位的通用列表List<int>
为8MB,那么64位只需要8.1MB,与ArrayList相比,它有481%的差异 .资料来源:ArrayList’s vs. generic List for primitive types and 64-bits
要添加的另一个区别是线程同步 .
更多信息在这里Thread Synchronization in the .Net Framework
简单的答案是,
ArrayList是非泛型的
它是一个对象类型,因此您可以将任何数据类型存储到其中 .
您可以在ArrayList中存储任何值(值类型或引用类型),如string,int,employee和object . (注意和)
拳击和拆箱将会发生 .
不安全 .
它比较旧了 .
列表是通用的
这是Type of Type,因此您可以在运行时指定T.
您可以根据声明存储Type T(string或int或employee或object)的唯一值 . (注意或)
拳击和拆箱不会发生 .
类型安全 .
这是更新的 .
示例:
Please read the Microsoft official document :https://blogs.msdn.microsoft.com/kcwalina/2005/09/23/system-collections-vs-system-collection-generic-and-system-collections-objectmodel/
Note :在了解差异之前你应该先了解泛型:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/
ArrayList
不是类型安全的,而List<T>
是类型安全的 . 简单:) .ArrayList
是不同类型数据的集合,而List<>
是其自身的类型的相似类型的集合 .我认为,
ArrayList
和List<T>
之间的区别是:List<T>
,其中T是值类型比ArrayList
快 . 这是因为List<T>
避免装箱/拆箱(其中T是值型) .许多消息来源说 - 通常
ArrayList
仅用于向后兼容 . (这不是真正的区别,但我认为这是重要的注意事项) .非通用的反射更容易
ArrayList
然后List<T>
ArrayList
有IsSynchronized
属性 . 因此,很容易创建和使用同步ArrayList
. 我没找到List<T>
的IsSynchronized
属性 . 另外请记住,这种类型的同步效率相对较低,msdn):ArrayList
具有ArrayList.SyncRoot
属性,可用于同步(msdn) .List<T>
没有SyncRoot
属性,因此在以下构造中,如果使用List<T>
,则需要使用某个对象:使用“列表”可以防止出现错误 . 避免运行时转换错误非常有用 .
例:
在这里(使用ArrayList),您可以编译此代码但是稍后您会看到执行错误 .
对我来说,了解你的数据 . 如果我继续在效率的基础上扩展我的代码,我将不得不选择List选项作为解密我的数据的方式,而不是总是想知道类型的不必要的步骤,尤其是“自定义类型” . 如果机器了解差异并且可以确定我实际处理的是什么类型的数据,那么为什么我要阻止并且浪费时间通过“IF THEN ELSE”确定的回转?我的理念是让机器为我而不是我在机器上工作?了解不同目标代码命令的独特差异对于使代码高效有很长的路要走 .
汤姆约翰逊(一次入境......一次出口)
这不仅仅是差异 . ArrayList成员可以像普通数组一样通过索引访问,并且ArrayList成员可以很容易地按直接和反向顺序排序,并且两个ArrayList可以很容易地合并,而简单List就不是这种情况 . 了解更多
http://www.cirvirlab.com/index.php/c-sharp-code-examples/112-c-sharp-arraylist-example.html