自动属性和初始化器

属性

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

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; }
}
时间: 2024-08-29 03:38:01

自动属性和初始化器的相关文章

[C#详解] (1) 自动属性、初始化器、扩展方法

代码下载:点我下载 目录 前言 属性与自动属性 属性 自动属性 初始化器 对象初始化器 集合初始化器 扩展方法 无参数扩展方法 带参数扩展方法 结尾 前言 首先祝大家2015新年快乐! 新的一年,新的开始.来博客园安家已经快两个月了.每天看博客.写博客.评论.回答博问已经渐渐养成了一种习惯.可以很明显的感觉到泡在博客园里真的可以学到很多,不论是技术文章的还是一些记叙经历.抒发感想的随笔,都让我从各个方面受益良多.不知道大家是否和我一样,就是感觉博客园有一种特殊的魔力,让你没事就想上去看一眼,看上

.NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也不禁地对编译器内部到底为我们做了哪些事儿而感到好奇?于是,我们就借助反编译神器,去看看编译器到底做了啥事!其实本篇中很多都不算新语法,对于很多人来说可能都是接触了很久了,这里主要是针对.NET的老版本来说,是一个“相对”的新语法. /* 新语法索引 */ 1.自动属性 Auto-Implemente

C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询

1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为.例如,在一个方法前标注[Obsolete]特性,则调用该方法时VS则会提示该方法已过期的警告,如下图: 又如,在.Net Re

C#中的自动属性、隐式类型var、对象初始化器与集合初始化器、扩展方法

1.自动属性(Auto-Implemented Properties) //以前的写法 .net2.0 private string _userName; public string UserName { get { return _userName; } set { _userName= value; } } //现在 只适合3.5以上 public string_userName {get;set;} 2.隐式类型var 它是在编译已经能确定变量的类型,是根据后面的值自动推断类型,编译时把推

关于自动属性和对象初始化器

当初始化类的对象时,如果有多个属性,考虑到每一种组合的话需要定义很多构造器,显然这是很麻烦的,通过对象初始化器可以很好地解决这个问题 在类中对字段初始化: 创建对象的时候使用对象初始化器: 1 //在创建类的时候对其属性进行初始化 2 class Polygon 3 { 4 public int NumSides { get; set; } 5 public double SideLength { get; set; } 6 public Polygon() 7 { 8 this.NumSide

[读书笔记]C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法

前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好处, 下一遍会单独介绍Lambda表达式. 这篇主要包括的内容有: 自动属性,隐式类型,对象集合初始化,匿名类型,扩展方法. 下面一起来看下C#3.0 所带来的变化吧. 1,自动实现的属性在C#3.0之前, 定义属性时一般会像下面这样去编写代码: 1 class Person 2 { 3 //定义私

010.里式转换、命名空间、字段属性、索引器

1.is asis:判断对象和类型的兼容 兼容---true 不兼容---false 子类兼容父类 子类对象 is 父类类型 --true对象 is 类型 (对象为此类型的对象 对象为此类型的子类的对象 --true)public class Person{}public class Student:Person{} Person per=new Person();Student stu=new Student();Person person=new Student();返回true:per i

6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器

1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的 /** protocol*/ protocol FullNamed { /** 计算属性申明,只读的计算属性*/ var fullName:String { get } } /** 实现协议*/ struct Person:FullNamed { /** 实现协议  可以把计算属性实现为存储属性,更改其本身的性质*/ var fullName: String = "abc" }

C#语法糖之第一篇:自动属性&amp;隐式类型

今天给大家分享一下C#语法糖的简单的两个知识点吧. 自动属性:在 C# 4.0 和更高版本中,当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁. 客户端代码还可通过这些属性创建对象. get and set accessors." id="mt3">如下面的示例所示声明属性时,编译器将创建一个私有的匿名支持字段,该字段只能通过属性的 get 和 set 访问器进行访问. 我们C#4.0以前的传统方式的属性是用来封装字段的,这里我简单的对比一下这两种方