C#中is,as,using关键字的使用说明

一、问题描述

在C#中is,as,using关键字具有其特点及使用场景,其中is关键字用于检查该对象是否与给定类型兼容,as关键字用于将对象转换为指定类型,using关键字除了用于引入命名空间之外,还具有回收对象资源,如文件资源、网络资源和数据库资源等。

1、is:用于检查对象是否与给定类型兼容,如果兼容,则返回true,否则返回false,不会抛出异常。在进行类型转换之前,可以先用is判断对象是否与给定类型兼容,如果兼容再进行转换。

案例:

string str ="test";
object obj = str;
if(obj is string) {string str2 = (string)obj};

2、as:用于引用类型之间转换,直接进行转换,若转换成功,则返回转换后的对象,若转换失败返回null,不抛出异常。

案例:

string str ="test";
object obj = str;
string str2 = obj as tring;
if(str2 !=null) {转换成功}

3、using:引用命名空间,有效回收资源,using关键字可以回收多个对象的资源,关键字后面的小括号内创建的对象必须实现IDisposable接口,或者该类的基类已经实现了IDisposable接口。回收资源的时机是在using关键字下面的代码块执行完成之后自动调用接口方法Dispose()销毁对象。

案例:

using (Test test =new Test()) { 各种操作;}
 calss Test :IDisposable {
   public void Dispose() {回收操作;}
 }

二、代码案例

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace test1
{
 public partial class Form9 : Form
 {
  public Form9()
  {
   InitializeComponent();
  }

  private void button1_Click(object sender, EventArgs e)
  {
   //转为object
   if (obj_rdb.Checked)
   {
    //使用using关键字,在代码块执行完成之后自动回收资源
    //由于FileStream已经实现了IDisposable接口,可以直接使用
    using (FileStream fileStream = new FileStream(@"d:\test.txt", System.IO.FileMode.Create))
    {
     object obj = fileStream as object; //直接使用as转换
     if (obj != null)
     {
      MessageBox.Show("FileStream转换为object成功", "提示信息");
     }
     else
     {
      MessageBox.Show("FileStream转换为object失败", "错误信息");
     }
    }
   }
   else
   {
    using (FileStream fileStream = new FileStream(@"d:\test.txt", System.IO.FileMode.Create))
    {
      //直接强制转换
     try
     {
      Stream stream = (Stream)fileStream;
      MessageBox.Show("FileStream转换为Stream成功", "提示信息");
     }catch(Exception ex)
     {
      MessageBox.Show(ex.Message, "错误信息");
     }

    }
   }

  }
 }
}

三、显示结果

补充知识:c#Constructor构造函数注入

1、创建接口

 public interface ITimeProvider
  {
    DateTime CurrentDate { get; }
    string CurrentYear { get; }
  }

2、继承接口,实现类

 public class TimeProvider : ITimeProvider
  {
    public DateTime CurrentDate { get { return DateTime.Now; } }
    public string CurrentYear { get { return DateTime.Now.Year.ToString(); } }
  }

3、创建注入机制

 public class Assembler
  {
    private static Dictionary<Type, Type> dictionary = new Dictionary<Type, Type>();
    public Assembler()
    {
      dictionary.Add(typeof(ITimeProvider), typeof(TimeProvider));
    }
    public object Create(Type type)
    {
      if (type == null || !dictionary.ContainsKey(type)) throw new NullReferenceException();
      Type targetType = dictionary[type];
      return Activator.CreateInstance(targetType);
    }

    public T Create<T>()
    {
      return (T)Create(typeof(T));
    }
  }

4、客户端调用

 public class Client
  {
    private ITimeProvider timeProvider;
    public Client(ITimeProvider timeProvider)
    {
      this.timeProvider = timeProvider;
    }
    public string GetYear()
    {
      return timeProvider.CurrentYear .ToString();
    }
    public string GetDatetime()
    {
      return timeProvider.CurrentDate.ToString();
    }
  }

5、使用实现

   ITimeProvider timeProvider = (new Assembler()).Create<ITimeProvider>();
      Client clinet = new Client(timeProvider);
      Console.WriteLine(clinet.GetYear());
      Console.WriteLine(clinet.GetDatetime());

以上这篇C#中is,as,using关键字的使用说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C# Dockpanel入门基础必看篇

    一.引用: 1.建立一个WinForm工程,默认生成了一个WinForm窗体Form1(此处默认为主窗体). 2.引用->添加引用->浏览->weiFenLuo.winFormsUI.Docking.dll. 3.设置Form1窗体属性IsMdiContainer:True. 4.工具箱->右键->选择项->.net组件->浏览->weiFenLuo.winFormsUI.Docking.dll->在工具箱出现dockPanel. 5.将dockPan

  • C# Split函数根据特定分隔符分割字符串的操作

    在C#程序开发过程中,很多时候可能需要将字符串根据特定的分割字符分割成字符或者List集合,例如根据逗号将字符串分割为数组,或者根据竖线将字符串分割成数组,C#中提供了Split()函数来快速将字符串分割成数组形式,如果需要转换为List集合,可在分割完成后使用数组的ToList()方法即可转换为List集合数据. 例如下列例子,将字符str按照逗号分隔成数组. string str = "A,B,C,D,E,F,G"; string[] strArr = str.Split(',')

  • C#中使用split分割字符串的几种方法小结

    第一种方法: 复制代码 代码如下: string s=abcdeabcdeabcde;string[] sArray=s.Split(c) ;foreach(string i in sArray)Console.WriteLine(i.ToString()); 输出下面的结果:abdeabdeabde 第二种方法: 我们看到了结果是以一个指定的字符进行的分割.使用另一种构造方法对多个字符进行分割: 复制代码 代码如下: string s=abcdeabcdeabcdestring[] sArra

  • C#调用7z实现文件的压缩与解压

    1.关于7z 首先在这里先介绍一下7z压缩软件,7z是一种主流的 压缩格式,它拥有极高的压缩比.在计算机科学中,7z是一种可以使用多种压缩算法进行数据压缩的档案格式.主要有以下特点: 来源且模块化的组件结构 最高的压缩比 强大的AES-256加密 可更改配置的压缩算法 支持操大文件 支持多线程压缩 具有多种压缩文件格式 2.解压缩实现代码 实现对文件的解压缩方法是通过cmd命令,调用7z程式通过cmd命令实现对文件进行解压和压缩的操作,具体实现代码如下: 压缩代码 压缩的cmd命令:"7Z a

  • c#  Linq distinct不会调用Equals方法详解

    我有以下课程 public class ModInfo : IEquatable<ModInfo> { public int ID { get; set; } public string MD5 { get; set; } public bool Equals(ModInfo other) { return other.MD5.Equals(MD5); } public override int GetHashCode() { return MD5.GetHashCode(); } } 我使用

  • c# base64转字符串实例

    转成 Base64 形式的 System.String: string a = "base64字符串与普通字符串互转"; byte[] b = System.Text.Encoding.Default.GetBytes(a); //转成 Base64 形式的 System.String a = Convert.ToBase64String(b); Response.Write(a); 转回到原来的 System.String: byte[] c = Convert.FromBase64

  • 完美解决c# distinct不好用的问题

    当一个结合中想根据某一个字段做去重方法时使用以下代码 IQueryable 继承自IEnumerable 先举例: #region linq to object List<People> peopleList = new List<People>(); peopleList.Add(new People { UserName = "zzl", Email = "1" }); peopleList.Add(new People { UserNa

  • C#中is,as,using关键字的使用说明

    一.问题描述 在C#中is,as,using关键字具有其特点及使用场景,其中is关键字用于检查该对象是否与给定类型兼容,as关键字用于将对象转换为指定类型,using关键字除了用于引入命名空间之外,还具有回收对象资源,如文件资源.网络资源和数据库资源等. 1.is:用于检查对象是否与给定类型兼容,如果兼容,则返回true,否则返回false,不会抛出异常.在进行类型转换之前,可以先用is判断对象是否与给定类型兼容,如果兼容再进行转换. 案例: string str ="test"; o

  • java中this与super关键字的使用方法

    java中this与super关键字的使用方法 这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~ this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this的用法在java中大体可以分为3种: 1.普通的直接引用 这种就不用讲了,this相当于是指向当前对象本身. 2.形参与成员名字重名,用this来区分: class Person { private int age = 10; public Perso

  • 浅谈Java中的final关键字与C#中的const, readonly关键字

    在编程语言中都有某种方式,告知编译器一块数据是恒定不变的.有两个需求 1. 一个永不改变的编译器常量 2. 一个在运行时被初始化的值,而这个值不会被改变 在Java中,使用final修饰变量实现这两个需求 <pre name="code" class="java">//编译器常量 private final int valueOne = 9; private static final int VALUE_TWO = 99; public static f

  • php中static和const关键字用法分析

    本文实例讲述了php中static和const关键字用法.分享给大家供大家参考,具体如下: static关键字在类中描述的成员属性和成员函数都是静态的. static成员能限制外部的访问,因为static成员是属于类的,而不是属于任何对象实例. 从内存的角度讲,其中对象是放在"堆内存"中,对象的引用是放在"栈内存"中,而静态成员被放在初始化静态段中,在类的第一次加载的时候加入的.可以让对内存中的所有对象所共享.如下图所示: <?php class Person

  • 浅谈C#2.0泛型中的变化:default关键字

    今天回答别人问题的时候,才发现原先的T.default语法被取消了,使用了新的default关键字来实现这一功能.还好回复前动手试了一下,不然就... 下面详细说明一下.之所以会用到default关键字,是因为需要在不知道类型参数为值类型还是引用类型的情况下,为对象实例赋初值.考虑以下代码: 复制代码 代码如下: class TestDefault<T>    {        public T foo()        {            T t = null; //???      

  • vue中添加与删除关键字搜索功能

    具体代码如下所示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible

  • mybatis中bind标签和concat的使用说明

    首先,二种方式都可以用来模糊查询,都能预防 SQL 注入.但是在更换数据库情况下,bind标签通用. <if test=" userName != null and userName !=""> and userName like concat('%' ,#{userName},'%') </if> 使用concat函数连接字符串,在mysql中这个函数支持多个参数,但是在oracle中这个函数只支持2个参数,由于不同数据库之间的语法差异,更换数据库,

  • c++中explicit与mutable关键字的深入探究

    今天说一说c++里面的两个关键字explicit和mutable. 1. explicit关键字 在写c++标准输入输出相关文章,查看iostream实现代码的时候,经常看到构造函数前面带有explicit关键字,那么它到底有什么作用呢. explicit用来防止由构造函数定义的隐式转换,先看这样一段代码: #include <iostream> class Base { private: int a; public: Base(int p_a){ a = p_a;} ~Base(){} vo

  • v-for循环中使用require/import关键字引入本地图片的几种方式

    目录 问题描述 方式一(后端返回图片URL) 方式二(前端使用require) 方式三(前端使用import) 总结 问题描述 我们做项目中,常常需要把图片呈现到页面上,一般来说有以下几种方式 方式一(后端返回图片URL) 这种方式就是后端返回图片的url地址,我们直接img标签的src属性绑定imgUrl即可.如下代码: <div class="item" v-for="(item, index) in apiArr" :key="index&qu

  • C++中引用和const关键字介绍

    目录 引用 常引用 const关键字用法 1)定义常量 2)定义常量指针 3)定义常引用 总结 引用 下面的写法定义了一个引用,并将其初始化为引用某个变量.类型名 & 引用名 = 某变量名; int n = 4; int & r = n; // r 引用了n,r的类型是 int & 某个变量的引用,等价于这个变量,相当于该变量的一个别名. int n = 7; int & r = n; // r 引用了n,r和n就是一回事 r = 4; cout << r; /

随机推荐