【C#食譜】【麵食】選單7:用預設值初始化泛型變數

weixin_34344677發表於2008-07-23

問題:ee6d64b9

你有一個泛型類包含一個由類自身定義型別引數的變數。由於對泛型物件的約束,你希望這個變數被初始化為其預設值。

解決方法:

非常簡單的方法:只要使用default關鍵字初始化其值為預設值即可:

    public class DefaultValueExample<T>
ExpandedBlockStart.gifContractedBlock.gif    
{
        T data 
= default(T);

        
public bool IsDefaultData()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            T temp 
= default(T);

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

            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return (false);
            }

        }

        
        
public void SetData(T val)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            data 
= val;
        }

    }

 

使用這個類的程式碼可以參考這裡:

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

namespace SetDefaultValueExample
ExpandedBlockStart.gifContractedBlock.gif
{
    
class Program
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            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>
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        T data 
= default(T);

        
public bool IsDefaultData()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            T temp 
= default(T);

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

            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return (false);
            }

        }


        
public void SetData(T val)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            data 
= val;
        }

    }

}

 當初始化一個相同型別引數的變數時,你不能只是設定這些變數為null。如果這個變數是值型別,比如說int或char,那會是什麼呢?那將不能執行,因為值型別不能是null的。你也許會想到一個nullable型別,比如long?或者Nullable<long>,可以被設為空。然而,編譯器無法知道使用者將使用什麼型別引數去構造這個型別。

default關鍵字允許你告訴編譯器在編譯時,這個型別的預設值將被使用。如果提供的型別引數是數值(int,long,decimal),那麼預設值將會是0。如果是引用型別,那麼預設值將會是null。如果是結構體,那麼這個結構體的預設值將根據其每一個欄位的型別設為0或null。

 

相關文章