C# in depth (第八章 用智能的编译器来防错)

8.1   自动实现的属性

公开可见的静态成员通常应该是线程安全的,编译器在这方面帮不上什么忙,得自己去实现

public class InstanceCountingPerson
    {
        public string Name { get; private set; }
        public int Age { get; private set; }

        private static int InstanceCounter { get; set; }
        private static readonly object counterLock = new object();

        public InstanceCountingPerson(string name, int age)
        {
            Name = name;
            Age = age;

            lock (counterLock)
            {
                InstanceCounter++;
            }
        }
    }

作者见过的使用静态自动属性的唯一情况是,取值方法是公共的,赋值方法是私有的,并且赋值方法只能在类型初始化程序中使用。

(以下代码无法通过编译)

  public struct Foo
    {

        public int Value { get; private set; }

        public Foo(int value)
        {
            this.Value = value;
        }
    }

只有加上this 才可以

 public struct Foo
    {

        public int Value { get; private set; }

        public Foo(int value) :this()
        {
            this.Value = value;
        }
    }

8.2 隐式类型的局部变量

8.2.1 用var声明局部变量

8.2.2 隐式类型的限制

  • 被声明的变量是一个局部变量,而不是静态字段和实例字段。
  • 变量在声明的同时被初始化;
  • 初始化表达式不是方法组,也不是匿名函数。
  • 初始化表达式不是null
  • 语句中只声明了一个变量。
  • 你希望变量拥有的类型是初始化表达式的编译时类型
  • 初始化表达式不包含正在声明的变量。

8.2.3 隐式类型的优缺点

8.2.4 建议

8.3 简化的初始化

8.3.1定义示例类型

 public class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }

        List<Person> friends = new List<Person>();
        public List<Person> Friends
        {
            get { return friends; }
        }

        Location home = new Location();
        public Location Home
        {
            get { return home; }
        }

        public Person()
        {
        }

        public Person(string name)
        {
            Name = name;
        }
    }

 public class Location
    {
        public string Country { get; set; }
        public string Town { get; set; }
    }

8.3.2 设置简单属性

C#3.0可以用一个表达式来设置对象的所有属性

8.3.3 为嵌入对象设置属性

8.3.4 集合初始化程序

时间: 2024-08-29 11:05:20

C# in depth (第八章 用智能的编译器来防错)的相关文章

C#复习笔记(4)--C#3:革新写代码的方式(用智能的编译器来防错)

用智能的编译器来防错 本章的主要内容: 自动实现的属性:编写由字段直接支持的简单属性, 不再显得臃肿不堪: 隐式类型的局部变量:根据初始值推断类型,简化局部变量的声明: 对象和集合初始化程序:用一个表达式就能创建和初始化对象: 隐式类型的数组:根据内容推断数组的类型,从而简化数组的创建过程: 匿名类型:允许创建新的临时类型来包含简单的属性: 自动实现的属性 这个特性简单的我都不想描述,但是为了保持内容的完整性,放一张图: 和匿名方法还有迭代器一样,它在编译器的帮助下会生成一个后备字段. 自动实现

用智能的编译器来防错

自动实现的属性 编写由字段直接支持的简单属性,不再显得臃肿不堪 C#2允许为取值方法指定不同的访问权限 #region 8-1统计创建了多少个实例的Person类 public class Person { public string Name { get; private set; }//声明有公有取值方法的属性 public int Age { get; private set; }   private static int InstanceCounter { get; set; }//声明

智能家居之安防智能控制系统

家是我们的避风港湾,家里藏着的都是我们生命里所有最宝贵的东西.所以家应该是温馨的,温暖的更应该是安全的.最近新出了一部电影<找到你>讲述的是姚晨主演的主角孩子在家里失踪的故事.孩子在家里失踪这样的事情也不是没有可能发生,但是我觉得这种事情应该是完全可以避免的.只需要一个智能家居安防控制系统就没有<找到你>这回事. 智能家居安防智能控制系统使用超声波.被动红外(PIR)探测器.气体传感器.玻璃破碎传感器.门磁等等的被动系统和强大的主动系统.实现各种防护功能给您的家庭绝对的安全保障.

浅谈智能家居安防监控的重要性

智能家居监控安防有多重要?有些人将之比作保险,认为出事了有用,没出事则无用武之地,而这种想法也常会形成一个错误的逻辑:家里一般都不出事,所以实际上没什么用.然而,这与不少美国人的想法差距很大,相关调查显示,62%的美国人选择智能家居的目的正是出于家庭安全考虑. 很多人可能不太了解智能家居,对智能家居中的安防更是基本没有概念,事实上智能家居安防在现代家庭中非常有必要.从广义上来讲,智能家居安防主要针对三个方面:一是家庭财产安全:二是家庭人身安全:三是家庭人身健康.那么针对这三个方面,智能家居都是如

智能帽子能遮阳还能实时监测体征

http://tinypic.com/useralbum.php?ua=Ivdn0kUPpdQsR3ar6XbQ1w%3D%3D http://tinypic.com/useralbum.php?ua=Ivdn0kUPpdSb%2B%2B7aupBqNg%3D%3D&as=new http://tinypic.com/useralbum.php?ua=Ivdn0kUPpdS%2ByG7gI4noFw%3D%3D&as=new http://tinypic.com/useralbum.php

C++关于智能指针

有四种: auto_ptr<class T> unique_ptr<class T> shared_ptr<class T> weak_ptr<class T> 这里先讨论前三种:   第一种 :auto_ptr  已摒弃:原因在于: 如 auto_ptr<class T> a(new T); auto_ptr<class T> b; b=a;         此时a已无所有权,b拥有所有权,再使用a会出错 第二种:unique_pt

指针辨析:悬垂指针、哑指针、野指针、智能指针

悬垂指针: 1:提出的原因: 请看下面的代码片段: [cpp] view plaincopyprint? int *p=NULL; void main() { int i=10;p=&i; cout<<"第一次:*p = "<<*p<<endl; cout<<"第二次:*p = "<<*p<<endl; } [cpp] view plaincopyprint? int *p=NULL;

第12章 智能家居

12.1智能家居概述 12.1.1传统家居与智能家居 物联网智能家居.传统智能家居区别 传统智能家居发展了20多年,至今为止取得了一定的进步,但技术落后.观点陈旧.创新乏力一直是中国传统智能家居企业的整体特征. 今天,随着物联网技术的高速发展,无线物联网技术给传统智能家居带来了全新的产业机会,一些全球优秀企业纷纷涉足物联网智能家居行业.在我国,虽然部分企业在无线物联网核心技术上取得了很大突破,但我们也应该清醒地看到大量技术落后的产品充斥市场仍是当前我国智能家居行业的重要特征.很多传统企业甚至一些

solidity编写智能合约(入门)

一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. 存储 contract SimpleStorage { uint storedData; function set(uint x) { storedData = x; } function get() constant returns (uint retVal) { return storedData; } } 在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成