interface IPerson
{
void GetSex();
}
public class Person
{
public Person() { }
public Person(string name, int age) { _name = name; _age = age; }
private string _name;
public string Name { get { return _name; } set { _name = value; } }
private int _age;
public int Age { get { return _age; } set { _age = value; } }
}
struct Family : IPerson // 可實作介面,不可繼承類別/結構
{
public string Name;
public int Age;
public bool Sex;
public string Country;
public Person Person; // 參考類別欄位
// 無參建構函式:結構不允許顯式定義
// 建構函式必須有參數
public Family(string name, int age, bool sex, string country, Person person)
{
Name = name; Age = age; Sex = sex; Country = country; Person = person;
}
// 實作介面方法
public void GetSex()
{
if (Sex)
Console.WriteLine(Person.Name + " is a boy.");
else
Console.WriteLine(Person.Name + " is a girl.");
}
public void ShowPerson()
{
Console.WriteLine("This is {0} from {1}", new Person(Name, 22).Name, Country);
}
// 可覆寫 Object 虛擬方法
public override string ToString()
{
return String.Format("{0} is {1}, {2} from {3}", Person.Name, Age, Sex ? "Boy" : "Girl", Country);
}
}
static void Main()
{
Person p = new Person("Tom", 25);
Family f = new Family("Tom", 25, true, "USA", p);
Console.WriteLine("f.GetSex():");
f.GetSex(); // Tom is a boy.
Console.WriteLine("\nf.ShowPerson():");
f.ShowPerson(); // This is Tom from USA
Console.WriteLine("\nf.ToString():");
Console.WriteLine(f.ToString()); // Tom is 25, Boy from USA
Console.WriteLine("\n--- 複製語意測試 ---");
Family f2 = f; // 值複製:完全獨立副本
f2.Name = "Jerry";
Console.WriteLine($"f.Name={f.Name}, f2.Name={f2.Name}"); // f.Name=Tom, f2.Name=Jerry
Person p2 = p; // 參考複製:指向同一物件
p2.Name = "Jerry";
Console.WriteLine($"p.Name={p.Name}, p2.Name={p2.Name}"); // p.Name=Jerry, p2.Name=Jerry
}
.NET 基底類別庫中,多數基礎型別實作為 struct:
| 類型 | 實作 | 理由 |
|---|---|---|
System.Int32, Double, Boolean 等 | struct | 頻繁使用、值語意、效能關鍵 |
System.Drawing.Point, Size, Rectangle | struct | 輕量幾何結構、大量陣列分配 |
System.DateTime, TimeSpan | struct | 不可變值型別、高頻運算 |
System.Guid | struct | 16 位元組、值語意、避免堆積分配 |
System.Nullable<T> | struct | 包裝值類別加上 null 狀態 |