[Spring.NET IoC] 之五:列表參數
我們可以在配置文件中向構造方法或者屬性注入列表型參數,諸如 Array、ArrayList、Hashtable 等。
1. IList
在 .NET Framework 中實現 IList 的主要是 Array、ArrayList。
<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.net
http://www.springframework.net/xsd/spring-objects.xsd">
<object id="HelloWorld" type="ConsoleApplication1.SpringNet.HelloWorld, Learn.CUI">
<constructor-arg name="list">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
<value>4</value>
</list>
</constructor-arg>
</object>
</objects>
<objects xmlns="http://www.springframework.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.net
http://www.springframework.net/xsd/spring-objects.xsd">
<object id="HelloWorld" type="ConsoleApplication1.SpringNet.HelloWorld, Learn.CUI">
<constructor-arg name="list">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
<value>4</value>
</list>
</constructor-arg>
</object>
</objects>
public class HelloWorld
{
public HelloWorld(IList list)
{
Console.WriteLine(list); // output: ArrayList
foreach (object o in list)
Console.WriteLine(o);
}
}
{
public HelloWorld(IList list)
{
Console.WriteLine(list); // output: ArrayList
foreach (object o in list)
Console.WriteLine(o);
}
}
我們會發現 Spring.NET IoC 缺省使用 ArrayList 來實現 IList 列表參數。
2. IDictionary
實現 IDictionary 的最常用類型是 Hashtable。
<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.net
http://www.springframework.net/xsd/spring-objects.xsd">
<object id="HelloWorld" type="ConsoleApplication1.SpringNet.HelloWorld, Learn.CUI">
<constructor-arg name="dict">
<dictionary>
<entry key="1" value="a" />
<entry key="2" value="b" />
<entry key="3" value="c" />
<entry key="4" value="d" />
</dictionary>
</constructor-arg>
</object>
</objects>
<objects xmlns="http://www.springframework.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.net
http://www.springframework.net/xsd/spring-objects.xsd">
<object id="HelloWorld" type="ConsoleApplication1.SpringNet.HelloWorld, Learn.CUI">
<constructor-arg name="dict">
<dictionary>
<entry key="1" value="a" />
<entry key="2" value="b" />
<entry key="3" value="c" />
<entry key="4" value="d" />
</dictionary>
</constructor-arg>
</object>
</objects>
public class HelloWorld
{
public HelloWorld(IDictionary dict)
{
Console.WriteLine(dict); // output:System.Collections.Specialized.HybridDictionary
foreach (object o in dict.Keys)
{
Console.WriteLine("{0}={1}", o, dict[o]);
}
}
}
{
public HelloWorld(IDictionary dict)
{
Console.WriteLine(dict); // output:System.Collections.Specialized.HybridDictionary
foreach (object o in dict.Keys)
{
Console.WriteLine("{0}={1}", o, dict[o]);
}
}
}
看看 System.Collections.Specialized.HybridDictionary 的MSDN說明
在集合較小時,使用 ListDictionary 來實現 IDictionary,然后當集合變大時,切換到 Hashtable。
建議將該類用于字典中的元素數量未知的情況。它利用了 ListDictionary 處理小集合時性能改善的優點,同時也可靈活地切換到處理較大集合時能力比 ListDictionary 更好的 Hashtable。
如果集合的初始大小大于 ListDictionary 的最佳大小,那么集合立即存儲在 Hashtable 中,以避免將元素從 ListDictionary 復制到 Hashtable 產生的系統開銷。
不錯,考慮得很周詳。
全站熱搜