天天看点

可空值类型

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data.SqlClient;

namespace _03可空值类型

{

class Program

{

static void Main(string[] args)

{

#region 可空值类型

//引用类型可空,值类型不可空

//int n = 10;

//string s = "hello";

//s = null;

//n = null;

// int? 等价于 Nullable<int>

//int? n = 10;

//Nullable<int> n = 10;

//n = 100;

//n++;

//Console.WriteLine(n);

//Console.WriteLine("ok");

//Console.ReadKey();

//Nullable继承于Struct,结构体是值类型的,并不能真正赋值为null(详见图一)

//所以可控制类型并没有把一个NULL值赋值给 变量n,而是编译时用另一中方式让你看起来可以为NULL。

//内部执行过程

//Nullable<int> n;

// 如果有值,那么内部HasValue属性赋值为true

//n.HasValue = true;

//然后赋值

//n.Value = 10;

//Nullable<int> n = null;

//如果为Null,那么只把HasValue属性赋值为false,并不真正赋值。

//n.HasValue = false;

// 使用到的时候,例如判断 int? n =null 时候为null值。

//if (n==null) //实际等价于 if(!n.HasValue)

//{

//}

// 下同

//double? d = 10.1;

//float? x = 99;

//bool? b = false;

////string? s = "aaa"; 报错可空值类型只能用于值类型,不能应用于引用类型,因为引用类型本身可以赋值为null。

#endregion

#region 使用带参数sql语句时的一个问题

string sql = "insert into TblPerson values(@name,@age,@height,@gender)";

SqlParameter[] pms = new SqlParameter[] {

new SqlParameter("@name","王五"),

new SqlParameter("@age",0), //报错 重载识别错误,详见图二。

//new SqlParameter("@age",System.Data.SqlDbType.Int){Value=0}, //建议指明类型。

new SqlParameter("@height",180),

new SqlParameter("@gender",true)

};

_02封装SqlHelper类.SqlHelper.ExecuteNonQuery(sql, pms);

Console.WriteLine("ok");

Console.ReadKey();

}

}

}

图一 、利用反编译软件 .NetReflector 7.0 查看内部代码:

可空值类型

 图二 重载问题

树立目标,保持活力,gogogo!