今天接触到两个新的类型,查了一下才发现它们已经出现好久了,特作一下标记
Nullable结构
在System命名空间下,在 .NET Framework 2.0 版中是新增的;用它定义的值类型的对象与引用类型一样也可以分配空引用
这样看来有点和 int? a 有点相似,根据不同的应用场合,我们会经常使用可空类型来表示存在或不存在的内容,但是这个Nullable 结构有两个基础成员为HasValue 和Value 属性,如果 Nullable 对象的 HasValue 属性为 true,则可以使用 Value 属性访问该对象的值。如果 HasValue 属性为false,则表示尚未定义该对象的值,并且尝试访问 Value 属性时会引发 InvalidOperationException,在使用这个值的时候如果使用这两个属性就极大的减少了忘记判断值类型造成的异常问题(一个值类型变量是不可以被赋予null值的,否则会产生异常),这就又出来了一个装箱拆箱的问题
int? First = null;
int Second = 2;
nFirst = Second; // 可以
nFirst = null; // 可以
Second = nFirst; // 如果直接复制就会抛出异常, if (nFirst.HasValue) Second 是一个非nullable型变量 侧不会。
HashSet集合
HashSet<T>集合 .NET Framework 3.5中出现在命名空间: System.Collections.Generic下,实现了 ICollection<T>, IEnumerable<T>等接口,从.Net Framework 4开始 又实现了ISet<T>接口
MSDN上说 HashSet<T> 类提供高性能的集运算(集合是一组不重复出现且无特定顺序的元素),由于他是无序的所以在操作数据的时候要比List<T>效率会高点,同事具有集合的功能
HashSet<T> 对象的容量将随该对象中元素的添加而自动增大。
案例如下:EF codefirst简单实现
public partial class Shop { public ClassInfo() { this.Products = new HashSet<Product>(); } [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int SID { get; set; } [Required] public string Sname { get; set; } public string SCode { get; set; } [Required] public Nullable<int> MemberID{ get; set; } [Required] public Nullable<int> SLevel{ get; set; } [Required] public Nullable<int> State{ get; set; } public string CloseReason{ get; set; } public virtual ICollection<Product> Products { get; set; } } public partial class Product { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int PID { get; set; } [Required] public string PName { get; set; } [Required] public Nullable<int> Count { get; set; } [Required] public Nullable<Decimal> Price { get; set; } [Required] public Nullable<int> State{ get; set; } [Required] public Nullable<int> Category{ get; set; } [Required] public Nullable<int> PWeight{ get; set; } public string Summary{ get; set; } public virtual Shop ShopEntity{ get; set; } } public partial class PJYDBEntities : DbContext { public PJYDBEntities() : base("name=PJYEntities") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException(); } public DbSet<Product> Product{ get; set; } public DbSet<Shop> Shop{ get; set; } }