zoukankan      html  css  js  c++  java
  • C#可空类型

    引用自:http://www.cnblogs.com/jhxk/articles/1619867.html

    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.
           
        }
    }
  • 相关阅读:
    centos 查看硬盘使用情况
    查看centos内存命令
    VS2008编译运行时出现“外部组件发生异常”错误的解决方法
    20170307-1
    20170307
    centos7安装配置git
    Git理解笔记3
    Git理解笔记2
    Git理解笔记1
    php-设计模式
  • 原文地址:https://www.cnblogs.com/gerryge/p/2315514.html
Copyright © 2011-2022 走看看