C#:結構

Rain Man發表於2014-04-08

1. 簡單示例

// 定義結構
public struct Person
{
    public string name;
    public int age;
}

class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();    // 例項化結構
        p.name = "Rain Man";
        p.age = 26;
        Console.WriteLine(p.name + ", " + p.age.ToString());    // 輸出: Rain Man, 26
    }
}

2. 結構的建構函式

結構同樣可以擁有建構函式,例如上例可以使用下面的程式實現;

public struct Person
{
    public string name;
    public int age;
    public Person(string n, int a)
    {
        this.name = n;
        this.age = a;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Person p = new Person("Rain Man", 26);            // 例項化並呼叫建構函式
        Console.WriteLine(p.name + ", " + p.age.ToString());    // 輸出: Rain Man, 26
    }
}

3. 結構的例項化可以不使用 new 關鍵字

public struct Person
{
    public string name;
    public int age;
    public Person(string n, int a)
    {
        this.name = n;
        this.age = a;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Person p;    // 由於未使用new關鍵字,因此不會呼叫Person的建構函式
        p.name = "Rain Man";
        p.age = 26;

        Console.WriteLine(p.name + ", " + p.age.ToString());    // 輸出: Rain Man, 26
    }
}

4. 結構的運算子過載

public struct Person
{
    public string name;
    public int age;
    public Person(string n, int a)
    {
        this.name = n;
        this.age = a;
    }

    // 運算子過載必須為:static
    // 函式的返回型別為: Person
    // 函式的引數型別為: Person
    public static Person operator +(Person p1, Person p2)
    {
        Person p;
        p.name = p1.name + " and " + p2.name;
        p.age = p1.age + p2.age;
        return p;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Person p1 = new Person("Tom", 26);
        Person p2 = new Person("Jerry", 10);

        Person p = p1 + p2;   // 使用運算子(+)過載
        Console.WriteLine(p.name + ", " + p.age.ToString());    // 輸出: Tom and Jerry, 36
    }
}

5. 結構與類的區別

從上面的示例可以看出結構和類很相似,一般來講結構能夠實現的功能,類都可以實現。 結構體作為一種自定義的資料型別,具有以特點:

  • 值型別,相比“類”而言對記憶體開銷較小;
  • 不能夠繼承,不能夠作為一個類的“基類”;
  • 結構體繼承自object類。

相關文章