码迷,mamicode.com
首页 > 其他好文 > 详细

自动属性和初始化器

时间:2016-05-13 01:36:01      阅读:315      评论:0      收藏:0      [点我收藏+]

标签:

属性

一般我们在类中都会有关键字,根据面向对象的法则,这个变量最好是私有的

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; }
}

自动属性和初始化器

标签:

原文地址:http://blog.csdn.net/he_wen_jie/article/details/51345185

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!