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

作者:tongyuehong 时间:2023-07-01 22:54:42 

一、问题描述

在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#中is,as,using关键字的使用说明

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

补充知识: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());

来源:https://blog.csdn.net/tongyuehong137/article/details/51395298

标签:C#,is,as,using
0
投稿

猜你喜欢

  • Docker环境下Spring Boot应用内存飙升分析与解决场景分析

    2023-04-28 05:00:24
  • android中图形图像处理之drawable用法分析

    2023-01-13 07:45:03
  • 执行java请求时导致在脚本执行结束时JVM无法退出

    2023-11-25 05:57:13
  • Android编程使用pull方式解析xml格式文件的方法详解

    2022-08-26 14:18:35
  • 详解c# 线程同步

    2023-11-23 08:54:48
  • Spring+SpringMVC+MyBatis深入学习及搭建(一)之MyBatis的基础知识

    2021-09-27 15:12:59
  • Java 重命名 Excel 工作表并设置工作表标签颜色的示例代码

    2023-02-22 15:35:34
  • 关于javascript冒泡与默认事件的使用详解

    2023-05-16 07:16:32
  • Android仿抖音列表效果

    2022-03-01 16:36:50
  • C#函数式编程中的惰性求值详解

    2022-01-27 03:07:29
  • Java 1.0和Java 1.1 的IO类的比较

    2023-10-07 10:48:39
  • Java中StringUtils与CollectionUtils和ObjectUtil概念讲解

    2023-11-29 07:45:38
  • Android中ListView的几种常见的优化方法总结

    2021-06-09 08:36:21
  • Bitmap海量数据快速查找去重代码示例

    2021-12-01 12:21:07
  • Android实现状态栏(statusbar)渐变效果的示例

    2023-09-19 19:13:43
  • Java持久化框架Hibernate与Mybatis优劣及选择详解

    2023-12-03 19:46:14
  • springboot实现异步任务

    2023-04-23 01:25:21
  • 一文详解Java Netty中的Constant类

    2023-03-03 17:17:55
  • java单例模式学习示例

    2022-03-29 19:03:41
  • Java中实现双数组Trie树实例

    2023-03-19 15:12:38
  • asp之家 软件编程 m.aspxhome.com