问题:
你有一个泛型类包含一个由类自身定义类型参数的变量。由于对泛型对象的约束,你希望这个变量被初始化为其默认值。
解决方法:
非常简单的方法:只要使用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;
}
}
{
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;
}
}
}
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。