1. 程式人生 > >自動屬性和初始化器

自動屬性和初始化器

屬性

一般我們在類中都會有關鍵字,根據面向物件的法則,這個變數最好是私有的

class Person
{
    private int Age;
}

但是我們有時要在類的外面訪問這個變數,如果定義成私有的就無法訪問了,最開始我想既然要要訪問那就都定義成public型別就好了,把不訪問的定義成private,為什麼要有屬性這個東西?舉個例子

class Person
{
    public int age;
}
static main()
{
    Person p = new Person();
    p.age = 1000;//年齡1000歲
}

我們發現如果定義成public,那麼就可以隨意的訪問和修改,然而修改的資料非常的不可思議,這必然會造成錯誤,此時就需要新增條件約束。我們可以通過get,set訪問器來對資料進行處理

class Person
{
    private int age;//單位cm
    public int Age
    {
        get
        {
            return Age;
        }
        set
        {
            if(Age < 100)
            {
                Age = value;
            } 
            else
            {
                Age = 100;
            }
        }
    }
}
static
void Main(string[] args) { Person p = new Person(); p.Age = 1000;//1000歲 Console.Write(p.Age); }

上面的賦值超出了範圍,在set中進行修改,最後得到的是100;

自動屬性

屬性的定義比較麻煩,先要定義一個私有變數,然後還要在get中return,在set中value=變數,所以有了自動屬性的誕生。

Class Person
{
    public int Age{get;set;}
    public int Height{get;set;}
}

自動屬性為我們省去了私有變數和get,set的定義,但是功能還是一模一樣的。通過reflect我們可以發現其實是編譯器為我們定義了一個匿名的私有欄位。如果我們想要對Age定義為只讀,可以

Class Person
{
    public int Age{get;private set;}
    public int Height{get;set;}
}

物件初始化

有了物件初始化之後,我們就不需要考慮定義不同的建構函式來應對不同情況的初始化了,這樣就減少了我們在類中定義建構函式的程式碼了。

class Program
{
    static void Main(string[] args)
    {
        Person p = new Person { Age = 10, Name = "tian" };
        Person pp = new Person { Age = 10 };
        Person ppp = new Person {Name = "tian"};
    }
}
class Person
{
    public int Age { get; set; }
    public string Name { get; set; }
}

上面的程式碼相當於這個樣子的

class Program
{
    static void Main(string[] args)
    {
        Person p = new Person(10, "tian");
        Person pp = new Person(10);
        Person ppp = new Person("tian");
    }
}
class Person
{
    public int Age { get; set; }
    public string Name { get; set; }
    public Person() { }
    public Person(int age,string name)
    {
        Age = age;
        Name = name;
    }
    public Person(int age)
    {
        Age = age;
    }
    public Person(string name)
    {
        Name = name;
    }
}

想想如果還不用自動屬性,那麼一個簡單的類就有多長。

集合初始化

除了物件初始化器,還有集合初始化器。

static void Main(string[] args)
{
    //一般集合初始化
    List<string> p = new List<string>();
    p.Add("p");
    p.Add("pp");
    p.Add("ppp");
    //集合初始化器
    List<string> newp = new List<string>
    {
        "p","pp","ppp"
    };
}

再來一個綜合的

class Program
{
    static void Main(string[] args)
    {
        var newp = new List<Person>
        {
            new Person {Age = 10,Name="tian" },
            new Person { Age = 10},
            new Person { Name = "tian"}
        };
    }
}
class Person
{
    public int Age { get; set; }
    public string Name { get; set; }
}