C#学习笔记(二十三)-- 类型比较

本文介绍了C#中关于对象类型检查和值比较的重要概念,包括GetType()和typeof()用于确定对象类型,以及is运算符的使用。讲解了封箱和拆箱的概念,这是值类型与引用类型转换的关键,特别是对于值类型的副本和引用的区别。此外,还阐述了is运算符如何判断对象是否属于特定类型或可转换为特定类型,提高了代码的可读性和灵活性。
摘要由CSDN通过智能技术生成

  在比较对象时,常需要了解它们的类型,才能确定是否可以进行值的比较。在这之前介绍了GetType()方法,所有的类都从System.Object中继承了这个方法,这个方法和typeof()运算符一起使用,就可以确定对象的类型,并据此执行操作:

if (myObj.GetType() == typeof(MyComplexClass))
{
   //myObj is an instance of the class MyComplexClass.
}

  前面还提到过ToString()的默认实现方式,ToString()也是从System.Object继承而来的,该方法可以提供对象类型的字符串表示。也可以比较这些字符串,但这是一种比较杂乱的比较方式。

  下面介绍比较值的一种简便方式:is运算符。它可以提供可读性较高的代码,还可以检查基类。在介绍is运算符之前,需要了解处理值类型(与引用类型相反)时后台的一些常见操作:封箱(boxing)和拆箱(unboxing)。

  1)封箱和拆箱

  封箱是把值类型转换为System.Object类型,或者转换为由值类型实现的接口类型。拆箱是相反的转换过程。

  例如,下面的结构类型:

struct MyStruct
{
   public int Val;
}

  可以把这种类型的结构放在object类型的变量中,对其封箱:

MyStruct valType1 = new MyStruct();
valType1.Val = 5;
object refType = valType1;

  其中创建了一个类型为MyStruct的新变量valType1,并把一个值赋予这个结构的Val成员,然后把它封箱在object类型的变量refType中。

  以这种方式封箱变量而创建的对象,会包含值类型变量的一个副本的引用,而不包含源值类型变量的引用。要进行验证,可以修改源结构中的内容,然后把对象中包含的结构拆箱到新变量中,并检查其内容:

ValType1.Val = 6;
MyStruct valType2 = (MyStruct)refType;
WriteLine($"valType2.Val = (valType2.Val)")

  执行这段代码将得到如下的结果:

valType2.Val = 5

  但在把一个引用类型赋予对象时,将执行不同的操作。把MyStruct改为一个类(不考虑这个类名不合适的情况),即可看到这种情形:

class MyStruct
{
   public int Val;
}

  如果不修改上面的客户代码(再次忽略名称有误的变量),就会得到如下输出结果:

valType2.Val = 6

  也可以把值类型封箱到接口类型中,只要它们实现这个接口即可。例如,假定MyStruct类型实现IMyInterface接口,如下所示:

interface IMyInterface{}
struct MyStruct : IMyInterface
{
   public int Val;
}

  接着把结构封箱到一个IMyInterface类型中,如下所示:

MyStruct valType1 = new MyStruct();
IMyInterface refType = valType1;

  然后使用一般的数据类型转换语法对其拆箱:

MyStruct ValType2 = (MyStruct)refType;

  从这些示例中可以看出,封箱是在没有用户干涉的情况下进行的(即不需要编写任何代码),但拆箱的一个值需要进行显示转换,即需要进行数据类型转换(封箱是隐式的,所以不需要进行数据类型转换)。

  封箱的重要性在于:首先,它允许在项的类型是object的集合(如ArrayList)中使用的值类型。其次,有一个内部机制允许在值类型(例如int和结构)上调用object方法。

  最后需要注意的是,在访问值类型内容前,必须进行拆箱。

  2)is运算符

  is运算符并不是用来说明对象是某种类型,而是用来检查对象是不是给定类型,或者是否可以转换为给定类型,如果是,这个运算符就返回true。

  在之前介绍的示例中,有Cow和Chicken类,它们都继承于Animal。使用is运算符比较Animal类型的对象,如果对象是这3种类型中的一种(不仅是Animal),is运算符就返回true。使用前面介绍的GetType()方法和typeof()运算符很难做到这一点。

  is运算符的语法如下:

<operand> is <type>

  这个表达式的结果如下:

  (1)如果<type>是一个类类型,而<operand>也是该类型,或者它继承了该类型,或者它可以封箱到该类型中,则结果为true;

  (2)如果<type>是一个接口类型,而<operand>也是该类型,或者它是实现该接口的类型,则结果为true;

  (3)如果<type>是一个值类型,而<operand>也是该类型,或者它可以拆箱到该类型中,则结果为true。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一个开源的持久化框架,可以帮助我们将数据从数据库中读取出来,然后转换为Java对象,并将Java对象写入数据库中。 在C#中使用MyBatis,需要先安装MyBatis.Net库,然后在项目中引用该库。接着,我们需要创建一个配置文件,用于配置MyBatis的数据库连接信息、SQL语句等。在配置文件中,我们需要指定一个别名,用于在程序中引用这个配置文件。 接下来,我们需要创建一个映射文件,用于将数据库中的数据映射为Java对象。在映射文件中,我们需要定义一个 resultMap,用于定义Java对象与数据库表之间的关系。我们还需要定义一个 SQL 语句,用于从数据库中读取数据,并将其转换为Java对象。 在程序中,我们需要创建一个 SqlSession 对象,用于执行SQL语句。我们可以通过SqlSession对象调用selectOne、selectList、update、delete等方法,来执行SQL语句,并将结果转换为Java对象或者操作数据库。 下面是一个简单的示例,展示了如何在C#中使用MyBatis: 1. 安装MyBatis.Net库 在Visual Studio中,选择“工具”-“NuGet包管理器”-“程序包管理器控制台”,然后输入以下命令: ``` Install-Package MyBatisNet ``` 2. 创建配置文件 在项目中创建一个名为“SqlMapConfig.xml”的文件,用于配置数据库连接信息、SQL语句等。以下是一个示例配置文件: ``` xml <?xml version="1.0" encoding="utf-8" ?> <sqlMapConfig> <database> <provider name="SqlServer" connectionString="Data Source=localhost;Initial Catalog=mydatabase;User ID=myuser;Password=mypassword;" /> </database> <sqlMap> <map resource="MyMapper.xml"/> </sqlMap> </sqlMapConfig> ``` 其中,provider元素用于指定数据库类型和连接字符串,map元素用于指定映射文件路径。 3. 创建映射文件 在项目中创建一个名为“MyMapper.xml”的文件,用于将数据库中的数据映射为Java对象。以下是一个示例映射文件: ``` xml <?xml version="1.0" encoding="utf-8" ?> <sqlMap namespace="MyMapper"> <resultMap id="MyResultMap" class="MyClass"> <result property="id" column="id"/> <result property="name" column="name"/> </resultMap> <select id="selectById" resultMap="MyResultMap"> SELECT * FROM mytable WHERE id=#id# </select> </sqlMap> ``` 其中,resultMap元素用于定义Java对象与数据库表之间的关系,select元素用于定义SQL语句。 4. 在程序中使用MyBatis 在程序中,我们需要创建一个 SqlSession 对象,用于执行SQL语句。以下是一个示例代码: ``` csharp using IBatisNet.DataMapper; using IBatisNet.DataMapper.Configuration; using IBatisNet.DataMapper.Configuration.Files; // 创建配置文件 DomSqlMapBuilder builder = new DomSqlMapBuilder(); ISqlMapper sqlMapper = builder.Configure(@"SqlMapConfig.xml"); // 执行SQL语句 MyClass obj = sqlMapper.QueryForObject<MyClass>("MyMapper.selectById", new { id = 1 }); ``` 以上是一个简单的示例,展示了如何在C#中使用MyBatis。实际上,MyBatis还有很多其他的用法和功能,需要我们在实际开发中去探索和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值