惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
G
Google Developers Blog
博客园 - 司徒正美
J
Java Code Geeks
aimingoo的专栏
aimingoo的专栏
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
T
The Blog of Author Tim Ferriss
D
Docker
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
腾讯CDC
V
Visual Studio Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
C
Check Point Blog
M
MIT News - Artificial intelligence
Jina AI
Jina AI
I
InfoQ
雷峰网
雷峰网
The Cloudflare Blog
美团技术团队
Engineering at Meta
Engineering at Meta

博客园 - Net_Learner

ASP.NET2.0 Provider模型(上) ——原理、模型与分析 浅析PetShop程序中的购物车和订单处理模块(Profile技术,异步MSMQ消息) PetShop数据库解读 petshop里的product.aspx页面详解 PetShop的工厂模式 PetShop之表示层设计 PetShop之业务逻辑层设计 PetShop之ASP.NET缓存 PetShop数据访问层之消息处理 PetShop数据访问层之数据库访问设计 PetShop的系统架构设计[转] Microsoft .NET Pet Shop 4 架构与技术分析 NET设计模式(3): 抽象工厂模式 NET设计模式(2): 工厂方法模式 NET设计模式(1): 简单工厂模式 六、泛型约束 五、用泛型副本替换哈希表 四、List和LinkedList性能比较 三、用泛型替代ArrayList 二、理解泛型
七、用默认值初始化泛型变量
Net_Learner · 2008-07-24 · via 博客园 - Net_Learner

问题:

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

解决方法:

非常简单的方法:只要使用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。