【c#】七个细节:【?】【??】【=>表达式】【where】类型转换之【is】和【as】

目录

 

一、可空类型:【?】

二、从可空类型引申的三元操作符:【??】

三、【=>】表达式【Lambda表达式】

四、约束泛型的where关键字

五、类型转换之IS和AS的用法

这里记录一下类型转换的法则:

is转换规则:

as转换规则:


一、可空类型:【?】

例如
int in=null;//错误
int? in=null;//正确

C#中,类似int,double等等一些基础的类型往往不可以赋值为null(空),一般情况下,我们会使用-1等特定值来作为null的存在。

在c#2.0中,引入了“”的方法。

当使用“”定义后,可以表示这个基础类型的所有值,另外也可以表示null,可以在特殊时候使用(一般情况下不要使用)

使用方法:

在定义变量时的数据类型后加【】,例:

int? a=null;

上面的写法是可空类型的简写方式,它最初的语法是 【System.Nullable<T> variable】,例:

System.Nullable<int> a;
a是一个类型为int的null

注意要点:

1、可空类型的使用类型只能是包含struct在内的任何【值类型】,不可以是【引用类型】。

附注:值类型和引用类型的参考文章:点击这里

2、在定义为可空类型时,同样需要赋值,只不过可以赋值为null;当赋值为null后,与任何一元或者二元操作符进行运算,结果都为null;当赋值为null与任何数据进行比较时,结果都为false

3、很多基础运算法则对于可空类型不适用,例如可空类型A与int类型B相加,运算会报错,这时可以用【HasValue】属性测试是否为空;

或者使用【GetValueOrDefault】属性返回该基础类型所赋的值或默认值;

再或者使用【??】运算符分配默认值,当前值为空的可空类型被赋值给非空类型时将应用该默认值,比如int?x=null;int y=x??-1;,但是切不可直接进行运算。


4、可空类型可以强制转换为对应的基础类型,比如int?x=3;int y=(int)x;,但在转换之前一定要先测试是否不为空,如果为空的话就会出错。

5、可空类型的最大意义应该是在于操作数据库上,因为有些数据库的类型支持null的,有了可空类型后操作更加方便,同时少了很多【if(object==null)】这样的判断。

 

二、从可空类型引申的三元操作符:【??】

在上面可控类型中,其实已经介绍了【??】的用法。

??】的意义在于对可空类型设置一个默认值,这样就可以减少很多赋值为null时带来的问题。

用起来类似与三元操作符:【?:

用法:

例1:
var name??:“Hello World!”;
//如果name为null,就选择后面那个值,有点类似 var name=name?"Hello World!" :name;

例2:
int? a1 = null; 
int a2=a1??-1;
//当a1为空时,a2就默认为-1;这一点和上面介绍可空类型时 注意要点3 相关

三、【=>】表达式【Lambda表达式】

=>】其实可以看作一个函数,=左面的是函数的参数,>右边是函数的表达式。

这个表达式要引用到【using System.Linq;】。

详情见示例:

=>表达式:

例1:常见
eventStatusItems.Where(y => y.Text == "Not Registered")
参数为Y,并且执行后让Y的text属性赋值为 "Not Registered";

例2:多参数
(m,n)=>m*n;
多个参数用()括号括起来并且注意逗号间隔  

例3:无参数
()=>Console.WriteLine("This is a Lambda expression.");  
这里有一对小括号,不能省略

例4:多表达式
(m,n)=>{int result=m*n; Console.WriteLine(result);}  
上述Lambda表达式的右边部分包含2个表达式,因此,该表达式的右边部分必须被"{"和"}"包围。

四、约束泛型的where关键字

在c#中where关键字是约束泛型用的。

搜索到的一个例子:

public class BusinessBaseBLL<T, S> : BaseBLL<T, S> where T : new() where S : BusinessDAL<T>, new()

看起来是不是感觉头很大?

实际上这个需要拆分解读:

1、语句:public class BusinessBaseBLL<T, S> : BaseBLL<T, S>

泛型类【BusinessBaseBLL<T, S>】继承自泛型类【 BaseBLL<T, S>】;

2、语句:BaseBLL<T, S> where T : new() 

泛型类【 BaseBLL<T, S>】有个约束条件:其中的T必须是一个具有无参构造函数的类;

3、语句“: where S : BusinessDAL<T>, new()

泛型类【BusinessBaseBLL<T, S>】中的S必须是 BusinessDAL<T>类型,且这个T必须具有无参构造函数的类!

五、类型转换之IS和AS的用法

IS和AS都和类型转换有关,简单的说,都和强类型转换有关。

int? a=null;
int b=a??12;
string c=(string)b;
//(string)就是一个强类型转换

这里记录一下类型转换的法则:

  • 1.任何类型都可以转换为其基类类型,用隐式转换完成;
  • 2.任何类型转换为其派生类型时,必须进行显示转换。如:(类型名)对象名;
  • 3.使用GetType可以取得任何对象的精确类型;
  • 4.基本类型可以使用Convert类实现类型转换;
  • 5.除了string以外的其他类型都有Parse方法,用于将字符串类型转换成对应的基本类型;例如:int.parse()
  • 6.值类型和引用类型的转换称为装箱(boxing)或拆箱(unboxing);

再回来看is和as:

is转换规则:

1. 检查对象类型的兼容性,并返回结果true(false);
2.不会抛出异常;
3.如果对象为null,刚返回false;

简单的说,is就是对转换进行一个检测,并没有真的进行转换,在if等条件语句判断中常见。

例:

   object o = "abc";
    if (o is string) //执行第一次类型兼容性检查
    {
        string s = (string)o; //执行第二次类型兼容性检查,并转换
        MessageBox.Show("转换成功!");
    }
    else
    {
        MessageBox.Show("转换失败!");
    }

as转换规则:

AS只能用来引用类型的转换或则能赋值为null类型的转换!

1.检查对象类型的兼容性,并返回转换结果,如果不兼容则返回null;
2.不会抛出异常;
3.如果结果判断为空,则强制执行类型转换将抛出NullReferenceException异常;

简单的说,as会直接尝试进行类型转换,不成功返回null,

例:

    object o = "abc";
    string s = o as string; //执行第一次类型兼容性检查,并返回结果
    if (s != null) 
        MessageBox.Show("转换成功!");
    else
        MessageBox.Show("转换失败!");

注:as比is少执行一次兼容性检查,性能可能会高一点点。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值