silver

前途迷茫。。。

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
1.C#中的ArrayList
 
使用默认构造器,创建了0容量的动态数组。这与我之前查的资料不相符(http://www.google.com/url?q=http%3A%2F%2Fblog.csdn.net%2Fgisfarmer%2Farchive%2F2009%2F04%2F22%2F4100050.aspx&sa=D&sntz=1&usg=AFrqEze7CaztuNKUeLSGDyE5Dq1S4vs8sA)“默认的构造器,将会以默认(16)的大小来初始化内部的数组”。
所以自己做了一下实验:
 

namespace ConsoleApplication3

{

    class Program

    {

        static void Main(string[] args)

        {

            ArrayList AL = new ArrayList();

            Console.WriteLine("Capacity " + "Count");

            Console.WriteLine(AL.Capacity+" "+AL.Count);

            AL.Add(3);

             Console.WriteLine(AL.Capacity+" "+AL.Count);

            AL.Add(3);

            AL.Add(3);

            AL.Add(3);

            AL.Add(3);

            Console.WriteLine(AL.Capacity+" "+AL.Count);

            Console.ReadKey();

 

        }

    }

}

 

这是实验结果:

 
 

可见资料是错误的。默认构造器,将会以0个容量来初始化动态数组。造成这一错误不知道是否跟C#3.0更新有关,如果有条件测试的朋友,帮忙试下在c#1.0 2.0下的情况。

然后当往动态数组添加一个内容时,数组的大小变为4。所以但我们只需要数组保存2个对象时,明确声明定义容量为2的动态数组,可以为我们节约一倍的容量,当对象足够大时,消耗是可观的。当动态数组填满时,容量会成倍增长。

 

这是文杰师兄的实验代码:

 class Program
    {
        static void Main(string[] args)
        {
            ArrayList a = new ArrayList();
            PrintDetail(a.Capacity, a.Count);
            for (int i = 3; i < 1000000; i *= 2)
            {
                a.Clear();
                for (int j = 0; j < i; j++)
                {
                    a.Add(j);
                }
                PrintDetail(a.Capacity, a.Count);
            }
        }
        public static void PrintDetail(int capacity,int count)
        {
            Console.WriteLine(count + " elment in arraylist:");
            Console.WriteLine("Capacity:" + capacity + " Count:" + count);
            Console.WriteLine();
        }
    }
 
输出结果:
 
0 elment in arraylist:
Capacity:0 Count:0
 
3 elment in arraylist:
Capacity:4 Count:3
 
6 elment in arraylist:
Capacity:8 Count:6
 
12 elment in arraylist:
Capacity:16 Count:12
 
24 elment in arraylist:
Capacity:32 Count:24
 
48 elment in arraylist:
Capacity:64 Count:48
 
96 elment in arraylist:
Capacity:128 Count:96
 
192 elment in arraylist:
Capacity:256 Count:192
 
384 elment in arraylist:
Capacity:512 Count:384
 
768 elment in arraylist:
Capacity:1024 Count:768
 
1536 elment in arraylist:
Capacity:2048 Count:1536
 
3072 elment in arraylist:
Capacity:4096 Count:3072
 
6144 elment in arraylist:
Capacity:8192 Count:6144
 
12288 elment in arraylist:
Capacity:16384 Count:12288
 
24576 elment in arraylist:
Capacity:32768 Count:24576
 
49152 elment in arraylist:
Capacity:65536 Count:49152
 
98304 elment in arraylist:
Capacity:131072 Count:98304
 
196608 elment in arraylist:
Capacity:262144 Count:196608
 
393216 elment in arraylist:
Capacity:524288 Count:393216
 
786432 elment in arraylist:
Capacity:1048576 Count:786432
 
 

2.自定义异常

 

.NET的异常并不能满足我们的需要,所以有时在应用程序中,也可而已从基类中派生出自己的异常类。这样就可以捕捉或抛出特殊的异常类,使得处理异常更加合理。

派生异常要注意尽量不要从System.Exception派生,因为在System命名空间里,有2个基本异常类,分别是ApplicationExcepionSystemException,他们都是派生自Exception,他们的用途也是不同的,ApplicationExcepion是可以用于编程者派生出自己的异常类,而SystemException则用于派生系统预定义的异常类,如数组越界IndexOutOfRangeException

 

MSDN中有提到这样的一句话“对于大多数应用程序,从 Exception 类派生自定义异常。最初要求自定义异常应该从 ApplicationException 类派生;但是在实践中并未发现这样有很大意义。”因为ApplicationExceptionSystemException都没有扩展异常基类的功能,只不过是为了区分系统预定义异常和用户自定义异常。

 

还要注意几点是:

异常类名称一定要以后缀 Exception 结尾。

应使异常可序列化。异常必须可序列化才能跨越应用程序域和远程处理边界正确工作。

 

这是MSDN里面标准的自定义异常:

 

public class NewException : BaseException, ISerializable
{
    public NewException()
    {
        // Add implementation.
    }
    public NewException(string message)
    {
        // Add implementation.
    }
    public NewException(string message, Exception inner)
    {
        // Add implementation.
    }

    // This constructor is needed for serialization.
   protected NewException(SerializationInfo info, StreamingContext context)
   {
        // Add implementation.
   }
}

 

 
 

3.类型的推断
 
C# 是一种强类型语言,它在每个变量和对象都必须具有声明类型。var 变量声明是C#3.0新加入的特性,它仅仅是一个关键字,它并不是C#3.0中的一种新的类型。
在使用var首先要注意在声明时一定要同时初始化变量,因为没有赋值,IDE就不能确定变量类型,而已不可以为空(null)。
var i = 10;
int i = 10;
这两个句子是等价的。
用var声明后,该变量是强类型的,下面的类型转换在编译时会报错。
var i = 10 ;
i = “test”;
当声明变量并赋值时,i 是整数型,将一个字符串赋值给整数显然是错误的。
 
 
var 还可以声明初始化数组,但数组元素必须有相同的类型,格式如下:
var testArray = new []{1,2,3};
或者是相同的应用类或为空(null),既然是引用类型的数组,必然包括空值(null)。
posted on 2009-07-26 02:01  silverVan  阅读(739)  评论(0)    收藏  举报