Skip to content
Rain Hu's Workspace
Go back

[IT] C# Depth Ch.2 C# 2

Rain Hu

C# 2

一、泛型

public static void Main(string[] args)
{
    PrintNames(GenerateNames());
}
public static void PrintNames(string[] names)
{
    foreach (string name in names)
    {
        Console.WriteLine(name);
    }
}
public static string[] GenerateNames()
{
    string[] names = new string[4];
    names[0] = "Mike";
    names[1] = "Rain";
    names[2] = "Jessica";
    names[3] = "Billy";

    return names;
}

示例2: ArrayList類型: ArrayList.Add是Object的方法,但如果塞入不適合的參數類型,可能會引發InvalidCastException

public static void Main(string[] args)
{
    PrintNames(GenerateNames());
}
public static void PrintNames(ArrayList names)
{
    foreach (object name in names)
    {
        Console.WriteLine(name);
    }
}
public static ArrayList GenerateNames()
{
    ArrayList names = new ArrayList();
    names.Add("Mike");
    names.Add("Rain");
    names.Add("Jessica");
    names.Add("Billy");

    return names;
}

示例3: StringCollection專用類型: 解決前述兩個問題,但也限制了返回值。

public static void Main(string[] args)
{
    PrintNames(GenerateNames());
}
public static void PrintNames(StringCollection names)
{
    foreach (string name in names)
    {
        Console.WriteLine(name);
    }
}
public static StringCollection GenerateNames()
{
    StringCollection names = new StringCollection();
    names.Add("Mike");
    names.Add("Rain");
    names.Add("Jessica");
    names.Add("Billy");

    return names;
}

示例4: List泛型

public static void Main(string[] args)
{
    PrintNames(GenerateNames());
}
public static void PrintNames(List<string> names)
{
    foreach (string name in names)
    {
        Console.WriteLine(name);
    }
}
public static List<string> GenerateNames()
{
    var names = new List<string>
    {
        "Mike",
        "Rain",
        "Jessica",
        "Billy"
    };
    return names;
}

1. 形參與實參 Parameter and Argument

// Type parameter
public class List<T> ... { }
// Type argument
List<string> list = new List<string>();
public class List<T> : IEnumerable<T>

2. 泛型類型與泛型方法的度(arity)

public class Dictionary<TKey, TValue>
public void Method() {}         // arity = 0
public void Method<T>()) {}     // arity = 1
public void Method<T1,T2>() {}  // arity = 2
public void Method<Tone, Ttwo>() {} // 編譯錯誤, 不能僅透過類型形參名稱重載方法
public void Method<T,T,T>(){}     // 編譯錯誤, 重複的類型形參名稱

var dict = new Dictoinary<string,string>(); // 同名類型實參是允許的

3. 泛型的適用範圍

4. 方法類型實參的類型推斷

public static List<T> CopyList<T>(List<T> input) { ... }

public static void Main()
{
    List<int> nums = new List<int>{ 1,2,3,5,8,13 };
    List<int> copyList1 = CopyList<int>(nums);
    List<int> copyList2 = CopyList(nums);       // 省略類型實參
}
public static void Main()
{
    var tuple1 = new Tuple<int,int>(3,7);
    var tuple2 = CreateTuple(4,2);
}   

public static Tuple<T1,T2> CreateTuple<T1,T2>(T1 x, T2 y) 
{
    return new Tuple<T1,T2>(x, y);
}

5. 類型約束

6. default 與 typeof

7. 泛型類型初始化與狀態

二、可空值類型

三、委托

四、迭代器

五、其它的小特性


Share this post on:

Previous
[LeetCode] 491. Non-decreasing Subsequences
Next
[LeetCode] 974. Subarray Sums Divisible by K