我的博客

asp.net 自学笔记及开发过程中的经验、技巧、摘录
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

七、用默认值初始化泛型变量

Posted on 2008-07-24 16:06  Net_Learner  阅读(2801)  评论(0编辑  收藏  举报

问题:

你有一个泛型类包含一个由类自身定义类型参数的变量。由于对泛型对象的约束,你希望这个变量被初始化为其默认值。

解决方法:

非常简单的方法:只要使用default关键字初始化其值为默认值即可:

    public class DefaultValueExample<T>
    
{
        T data 
= default(T);

        
public bool IsDefaultData()
        
{
            T temp 
= default(T);

            
if (temp.Equals(data))
            
{
                
return (true);
            }

            
else
            
{
                
return (false);
            }

        }

        
        
public void SetData(T val)
        
{
            data 
= val;
        }

    }

 

使用这个类的代码可以参考这里:

using System;
using System.Collections.Generic;
using System.Text;

namespace SetDefaultValueExample
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            DefaultValueExample
<int> dv = new DefaultValueExample<int>();

            
// 检查是否被设置为默认值,如果是返回true
            bool isDefault = dv.IsDefaultData();
            Console.WriteLine(
"Initial data: " + isDefault);

            
// 设置数据
            dv.SetData(100);
            
// 再次检查,这个时候应该返回false
            isDefault = dv.IsDefaultData();
            Console.WriteLine(
"Set data: " + isDefault);
        }

    }


    
public class DefaultValueExample<T>
    
{
        T data 
= default(T);

        
public bool IsDefaultData()
        
{
            T temp 
= default(T);

            
if (temp.Equals(data))
            
{
                
return (true);
            }

            
else
            
{
                
return (false);
            }

        }


        
public void SetData(T val)
        
{
            data 
= val;
        }

    }

}

 当初始化一个相同类型参数的变量时,你不能只是设置这些变量为null。如果这个变量是值类型,比如说int或char,那会是什么呢?那将不能运行,因为值类型不能是null的。你也许会想到一个nullable类型,比如long?或者Nullable<long>,可以被设为空。然而,编译器无法知道用户将使用什么类型参数去构造这个类型。

default关键字允许你告诉编译器在编译时,这个类型的默认值将被使用。如果提供的类型参数是数值(int,long,decimal),那么默认值将会是0。如果是引用类型,那么默认值将会是null。如果是结构体,那么这个结构体的默认值将根据其每一个字段的类型设为0或null。