【C#小知识】C#中一些易混淆概念总结(九)---------异常,文件流对象,.NET序列化,多线程

终于有时间来完成这个系列的最后一篇关于C#中异常,文件流对象,序列化,多线程问题的总结。

首先就来看关于异常的相关知识吧

一,异常

首先区分三个概念:警告,异常和错误。不管对于编程新手或者是老手对这三个概念都应该是非常熟悉,且是经常遇到的。

  1. 警告:在程序中出现,对于程序的执行没有影响。
  2. 异常:在运行的时候发生,一旦发生程序就会停止。
  3. 错误:一直是 指程序不符合语法规范。

在C#中的标准抛出异常的语句如下:

try
            {
                //尝试执行的语句
            }
            catch (Exception)
            {
                //抛出异常的语句
                throw;
            }
            finally
            {
                //最终执行的语句
            }

关于try....catch语句最常见的问题就是try中的语句是在finally之前返回还是在之后返回。

看如下的代码:

public int Test()
        {
            int i = 1;
            int k = 0;
            int m = 1;
            try
            {
                //尝试执行的语句
               //int n = i / k;
                return m;
            }
            catch (Exception)
            {
                //抛出异常的语句
                throw;
            }
            finally
            {
                //最终执行的语句
                m=m+2;
            }
        }

当我们在Main()方法中调用Test()方法时,返回值是什么呢?答案是:1。那么这是为什么呢?

这就要借助我们反编译工具了,反编译代码如下:

由上我们可以看出在try中return的值会先保存在.NET FramWork自动生成的变量中,并在finally后返回。

finally语句在最后执行,只过不返回的是在try中要return的值,而return的状态也发生在finally执行之后。

二,文件流对象

文件流对象就是指FileStream对象,该对象主要用于大文件的操作。我们先来看一段示例代码,来使用该对像来拷贝一个大文件

//读文件
        public string FileCopy()
        {
            //创建一个文件流对象并给这个文件流对象指定操作文件的路径和文件的操作方式
            FileStream stream = new FileStream(@"c:\2.txt",FileMode.Open);
            //准备一个byte数组以供文件流对象来读取数据并放到数组里面
            //public override int Read(byte[] array, int offset, int count);主要是StreamFile对象的Read方法只有一种方法
            byte[] buffer=new byte[1024*1024];
            //调用文件流的读取数据的方法,将读取出来的字节放到buffer数组中
            stream.Read(buffer, 0, buffer.Length);
            //将字节数组以指定的编码转换为字符串
           string  str=  Encoding.Default.GetString(buffer);
           //释放资源
            stream.Dispose();

            return str;
        }

        //写文件
        public void FileWrite(string str)
        {
            FileStream strWrite = new FileStream(@"d:\2.txt", FileMode.Create);
            //将字符串转换为指定编码的字节数组
            byte[] buffer = Encoding.UTF8.GetBytes(str);
            //写对象
            strWrite.Write(buffer, 0, buffer.Length);
            strWrite.Dispose();
        }

过程如下:

 三,.NET的序列化问题

序列化主要是为了保存对象的状态,将它们持久化到某个设备上(如:硬盘);

比如我们现在要保存对象属性的状态,看下买你的代码:

时间: 2024-10-18 21:13:25

【C#小知识】C#中一些易混淆概念总结(九)---------异常,文件流对象,.NET序列化,多线程的相关文章

Js小知识及一些常见易混淆的知识点

1.offsetleft  =  整数(可以是正,也可以是负数).如果是浮点数,则始终向下取整 =90px,因为像素里没有小数,自动抛弃整数,表现为向下取整 2.区别假设:body{     height:2000px  }function getInfo(){var s = "";s += " 网页可见区域高:"+ document.body.clientHeight;——可见高度是2000px,表示全部可见高度 s += " 网页可见区域宽:"

J2EE中常见易混淆概念

OOAD   Object Oriented Analysis Design,面向对象的分析和设计 JNDI     Java Naming and Directory Interface,Java  命名和目录接口 JTA  Java Transaction API 分布式事务(Distributed Transaction)包括事务管理器(Transaction Manager)和一个或多个支持 XA 协议的资源管理器 ( Resource Manager ) RPC Remote Proc

java易混淆概念之类变量、成员变量、局部变量

java易混淆概念之类变量.成员变量.局部变量 类变量.成员变量.局部变量 类变量(也叫静态变量)是类中独立于方法之外的变量,用static 修饰.(static表示“全局的”.“静态的”,用来修饰成员变量和成员方法,或静态代码块(静态代码块独立于类成员,jvm加载类时会执行静态代码块,每个代码块只执行一次,按顺序执行)). 成员变量(也叫“实例变量”.“域”)也是类中独立于方法之外的变量,不过没有static修饰. 局部变量是类的方法中的变量. 看下面的伪代码说明: public class 

学习笔记(2)---CSS中的易混淆点

transition和transform以及animation的区别 transition:是元素从一种样式变换为另一种样式时为元素添加的效果 必须规定的两项内容有:a.规定你希望把效果添加到哪个CSS属性上 b.规定效果的时长(如果时长未规定,则不会有过渡效果,因为默认值是 0.) transform:能对元素进行移动.缩放.转动.拉长或拉伸,是使元素改变形状.尺寸和位置的一种效果.(分为2D转换和3D转换) animation:是使元素从一种样式逐渐变化为另一种样式的效果.可以改变任意多的样

[小知识]Python中__call__方法 @ Python

python中的__call__方法可以把class当做函数调用.例程如下: #coding=utf-8 class A(object): def __init__(self, x): self.x = x def __call__(self, y): return self.x * y C = A(10) #C这个instance可以当做函数来调用 print C(5) # 50

概率论中两个易混淆概念(概率分布函数 VS. 概率密度函数)

随机变量的分布函数: 1. 定义 设X是一个随机变量,x是任意实数,函数F(x)=P{X<=x}称为X的分布函数. 2.1 性质 对于任意x1,x2,P{X<=x2}-P{X<=x1}=F(x2)-F(x1),因此分布函数描述了随机变量的统计规律性. 2.2 性质 对于连续型随机变量P{X=a}=0,在这里事件{X=a}并非是不可能事件,但有P{X=a}=0. 随机变量的密度函数: 1. 定义 如果对于随机变量X的分布函数F(x),存在非负函数f(x),使得对于任意实数有 ,则称X为连续

解析接口 一些易混淆概念

对于接口来说,C#是有规定使用Interface关键字来声明接口.它的声明是和类一致的.可以说接口就是一个特殊的抽象类.如下代码: class Program { static void Main(string[] args) { } } //声明一个可以飞的接口 interface IRunable { //包含可以被继承的子类实现的方法 void Run(); } 由以前的抽象类的知识可以知道,抽象类是没有办法实例化的(因为含有抽象成员,而抽象成员不含有方法体).那么接口可不可以实例化呢?答

指针和数组,字符和字符串等易混淆概念举例

指针和数组相关概念 文档不知道从哪搞的,基础知识,觉得有用的可以看看,留存. 有侵权的内容,请及时告知,谢谢! 指针和数组相关概念 ************************************************* 字符与字符串的区别:单引号字符其实就是代表ASCII码的整数,而字符串代表了无名数组起始的指针 指针与数组1:任何一个数组下标运算都等同于一个对应的指针运算:对数组只能知道数组的大小,和获得指向下标为0的指针,intcalendar[12][31];sizeof(ca

array,vertor,arraylist,hashable,hashmap等几个易混淆概念的区别

Array可以存放Object和基本数据类型,但创建时必须指定数组的大小,并不能再改变, Vertor是放的Object. Vertor一维,Hashmap/Hashtabe二维: Vertor/Arraylist用index作检索,Hashmap/Hashtabe用key作为检索: Hashmap,Arraylist不是同步的,意味着它们的速度更快: Hashtable,Vertor是同步的,适用于与线程有关时: Hashtale的key不能为null,Hashmap的key和values都可