c#可空类型(e.g:int? values)

MSDN说:

可空类型可以表示基础类型的所有值,另外还可以表示 null 值。可空类型可通过下面两种方式中的一种声明:

1、System.Nullable<T> variable

2、T? variable

T 是可空类型的基础类型。T 可以是包括 struct 在内的任何值类型;但不能是引用类型。

有关可能使用可空类型的示例,请考虑普通的布尔变量如何能够具有两个值:true 和 false。不存在表示“未定义”的值。在很多编程应用中(最突出的是数据库交互),变量可存在于未定义的状态。例如,数据库中的某个字段可能包含值 true 或 false,但是它也可能根本不包含值。同样,可以将引用类型设置为 null,以指示它们未初始化。

可空类型修饰符使 C# 能够创建表示未定义值的值类型变量。


示例:

 

代码
using  System;

public   class  arpu
{
     
private   string  myname;
     
private   int ?  age = null ;
     
private   int ?  male = null ;

     
public   string  MyName
     {
         
get  {  return  myname; }
         
set  { myname  =  value; }
     }

     
public   int ?  Age
     {
         
get  {  return  age; }
         
set  { age  =  value; }
     }

     
public   int ?  Male
     {
         
get  {  return  male; }
         
set  { male  =  value; }
     }

     
public  arpu( string  name)
     {
         myname 
=  name;
     }

     
public   void  output( string  str)
     {
         Console.WriteLine(
" 姓名:{0} " ,myname);
         Console.WriteLine(
" 年龄:{0} " ,age == null ? str:age.ToString());
         Console.WriteLine(
" 性别:{0} " ,male == null ? str:(male == 1 ? " " : " " ));
     }
}
public   class  test
{
     
static   void  Main( string [] args)
{


     arpu a 
=   new  arpu( " 刘锋 " );
     a.Male 
=   1 ;
     a.Age 
=   24 ;
     a.output(
" " );
     arpu b 
=   new  arpu( " 小甜 " );
     b.Male 
=   null ;
     b.Age 
=   null ;
     b.output(
" 未知 " );

}
   
  
    
}

 

 

 

C#中的可空类型

 

1.值类型后加问号表示此类型为可空类型,如int? i = null;
2.可空类型与一元或二元运算符一起使用时,只要有一个操作数为null,结果都为null;
3.比较可空类型时,只要一个操作数为null,比较结果就为false。

运算符:
一元:!、~、++、--、-(负号)、*(指针)、&、sizeof
二元:*、/、%、+、-、<<、>>、<、<=、>、>=、==、!=、&、^、|、&&、||、=、+=、-=、*=、/=、%=、>>=、<<=、&=、^=、|=
三元:? :

 

代码
using  System; 

namespace  Magci.Test.Operators 

 
public   class  TestNull     
 { 
   
public   static   void  Main()        
  { 
          
   
// 值类型后加问号表示此类型为可空类型 
    int ?  a  =   null
           
   
int ?  b  =  a  +   1
           
   
int ?  c  =  a  *   2
           
   Console.WriteLine(
" b =  "   +  b); 
            
   Console.WriteLine(
" c =  "   +  c); 

           
// 比较可空类型时,只要一个操作数为null,比较结果就为false 
    int ?  i  =   null
            
   
int ?  j  =   2
           
   
if  (i  <  j)            
   { 
      Console.WriteLine(
" i < j " );          
   } 
   
else   if  (i  >=  j) 
   {                 
     Console.WriteLine(
" i >= j " );           
   } 
   
else             
   {                 
     Console.WriteLine(
" i and j can not be compared! " ); 
   }         
  }   
 } 
}

 

 

有关C#可空类型的几个例子(源代码):点击下载

 

 

   可空类型允许变量包含未定义的值。在使用数据库和其他可能包含未含有具体值的元素的数据结构时,可以使用可空类型。对于我们使用数据库作为后端的应用程序来说,这一点尤其有用。举个例子,对于人员信息来说,姓名可能是必不可少的,而其他信息比如年龄、性别等用户可以不填,也就是说在数据库中可以为空。

从前在我们为人员信息生成了一个类型化的数据集之后,要从中读取一个可以为空的信息时,我们必须首先判断它是否为空,例如:

 

if(PersonInfoRow.IsAgeNull()==false)
{
Label1.Text=personInfoRow.Age;
}

 

而要将该字段设为空,也必须调用专用的方法,如:

 

if(Text1.Text.Trim()==string.Empty)
{
personInfoRow.Age=Text1.Text;
}

   这种限制使得我们在开发过程中要相当小心,并且需要使用相当多的或许是不必要的代码来防止错误发生。在引入了可空类型之后,我们的开发就变得轻松多了。所要做的只是在类型声明后面加上一个?号:

int?number;
之后,便可以放心地将空值赋给它了:
number=null;

  

   如果探究可空类型的原理,我们就会发现它其实是泛型的杰作。可空类型是System .Nullable结构的实例。可空类型可以表示其基础值类型正常范围内的值,再加上一 个null值。例如,Nullable,读作"可空的Int32",可以被赋值为-2 147 483 648到2 147 483 647之间的任意值,也可以被赋值为null值。Nullable可以被赋值为true、false或null。过去,在需要使用三态数据的时候(三态数据在数据库里用得非常频繁,例如一个网站用户可以公开是男是女,也可以对自己的性别保密),我们常常需要自己定义一个枚举,现在使用Nullable就可以了。

  

   在不想使用泛型的写法来写的时候,我们就可以用数据类型加上问号这种等效写法来写,如Nullable等效于Int32?或int?,Nullable等效于bool?,等等。

在使用的时候要注意如下几点:

 

(1)因为可空类型可能为空,于是很多运算法则将不再简单适用,比如A+B,如果A或者B当中有一个或者两个为可空类型,那么它们便不能简单相加,因为它们可能会为空,这时结果也就可能会为空,所以一定要先使用HasValue属性测试是否为空,或者使用GetValueOrDefault属性返回该基础类型所赋的值或默认值,再或者使用??运算符分配默认值,当前值为空的可空类型被赋值给非空类型时将应用该默认值,比如int?x=null;int y=x??-1;,但是切不可直接进行运算。

 

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

 

(3)由于以上两点原因,建议不要随意使用可空类型,只在必要的时候才使用,使用时一定要小心谨慎,随时记得判断是否为空。


 我们来看一下可控类型默认值:

示例:

 

代码
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;

///   <summary>
/// Class1 的摘要说明
///   </summary>
public   class  Class1
{
    
public   int ?  _id;

    
public   int ?  Id
    {
        
get  {  return  _id; }
        
set  { _id  =  value; }
    }

    
public  Class1()
    {
        
//
        
// TODO: 在此处添加构造函数逻辑
        
//
    }
}

 

 

代码
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;
using  System.Web.UI;
using  System.Web.UI.WebControls;

public   partial   class  Default6 : System.Web.UI.Page
{
    
protected   void  Page_Load( object  sender, EventArgs e)
    {
        Class1 c 
=   new  Class1();
        Response.Write(c._id
+ " <br> " );
        Response.Write(c.Id);//结果什么都没有输出,在类的成员变量(全局变量),可控类型默认值为null,如果是非可空的int类型默认值为0.
       
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值