zoukankan      html  css  js  c++  java
  • C#高级编程 (第六版) 学习 第三章:对象和类型

    第三章 对象和类型

    1,类和结构

    类存储在托管堆上

    结构存储在堆栈上

     

    2,类成员

    类中的数据和函数称为类成员

    • 数据成员

    数据成员包括了字段、常量和事件

     

    • 函数成员

    方法:与某个类相关的函数,可以是静态方法,也可以是实例方法。

    声明:

    [modifiers] return_type MethodName([parameters]){}

    调用函数时均通过值传递,值类型传递值,引用类型传递引用。

    方法的参数声明为ref,即按引用传递,但是调用时变量仍需初始化

    可以使用out关键字声明方法参数。该变量通过引用传递且可不初始化,调用的时候也要声明为out。

     

    方法可以重载,但是不同仅通过返回值类型不同参数是否为ref和out区分重载方法。

    属性:可在客户机上访问的函数组

    使用

    //private string foreName;

    //declare a property

    public string SomeProperty

    {

        get

        {

            return foreName;

        }

        set

        {

            if(condition)

                statements;

            else

                foreName = value;

        }

    }

    get和set称为访问器。

    get不带参数,必须返回属性声明的类型。

    set的参数为value,类型和属性类型相同。

     

    在属性中省略set访问器,为只读属性,省略get访问器,为只写属性。

    可以为set和get设置不同的访问修饰符,但是其中一个必须具有属性的访问级别。

    如果get和set中没有任何逻辑,就可创建自动实现的属性,这种属性可以自动实现基础成员变量,即连字段都可不声明。例

    public string UserName{get;set;}

    //或者

    public string UserName{get;}

    //或者

    public string UserName{get;private set;}

    注:由CLR处理,没有inline修饰符

    构造函数:在实例化对象是自动调用的函数

    如果没有提供一个构造函数,编译器会在后台自动创建一个默认构造函数,它会把所有成员字段初始化为默认值。如果自己定义了一个,编译器就不会重新创建默认构造函数了。

     

    静态构造函数:static ClassName(){}没有参数,类中有一些静态字段或属性,需要在第一次使用类之前,从外部源码中初始化这些静态字段和属性。无访问修饰符,CLR一般在代码引用类之前执行,但不知道什么时候执行。只能访问静态成员,不能访问实例成员。

     

    从其他构造函数中调用构造函数

    class Car

    {

        private string description;

        private uint nWheels;

        public Car(string model, uint nWheels)

        {

            this.description = model;

            this.nWheels = nWheels;

        }

        

        public Car(string description):this(description, 4)

        {

            

        }

    }

    使用this关键字调用最匹配的那个构造函数,C#还允许使用base调用基类构造函数,但是base和this不能同时使用,只能使用一个。

     

    只读字段:可以在构造函数中初始化的常量字段。如果构造函数未赋值,编译器给默认值。

    public c;ass DocumentEditor

    {

        public static readonly uint MaxDocuments;

        public readonly DataTime CreationData;

        public Document()

        {

            MaxDocuments = 10;

            CreationData = new DataTime(2002,2,2);

        }

    }

     

    终结器:CLR检测到某个函数不再需要时调用,为类名前加个"~"号,类似于C++的析构函数。

    运算符

    索引器:允许对象以数组或者集合的方式进行索引

     

    3,匿名类型

    使用var和new,可以创建一个继承于Object的,没有名称的类。

    var caption = new {FirstName = "James", MiddleName = "T", LastName = "Kirk"};

    这种新对象的类型名是未知的,编译器伪造了一个名称,只有编译器才能使用这个名称。

     

    4,结构

    定义结构与定义类相同,

    但是

    结构是值类型,不是引用类型。

    结构不支持继承

    编译器总提供一个无参的默认构造函数,这是不允许替换的。

     

    结构继承于System.ValueType类,和System.Object类基本相同。

    默认构造函数将结构字段的值初始化为0.

     

    5,部分类

    在struct,class和interface前加上partial,可以声明部分类,即可以将类的声明放在不同的源文件中。

     

    6,静态类

    static class StaticClass{}

    静态类中所有成员必须是静态的,

     

    7,Object类

    所有.Net类均派生于Object类,如果声明类是没有指定基类,则基类为Object

    ToString():获得对象的字符串表示的一种快捷方式

    GetHashTable():对象放在映射的数据结构中,可以使用这种方法

    Equals():比较相等

    Finalize():类似于析构函数,用于清理非托管资源。

    GetType():获得对象所属类的信息

    MemberwiseClone():复制对象,返回引用,浅复制。非虚拟。

     

    8,扩展方法

    在没有源代码的情况下添加方法

    namespace Chapter3.Extensions

    {

        public static class MoneyExtension

        {

            public static void AddToAmount(this Money money, decimal amountToAdd)

            {

                money.Amount += amountToAdd;

            }

        }

    }

    cash1.AddToAmount(10M);

    扩展方法是静态的,但是通过调用实例方法的形式进行调用。

  • 相关阅读:
    JS随笔
    tp5 redis 单例模式 转载
    分享我编程工作经历及对软件开发前景的看法
    redis详解(一)-- 概述
    redis详解(二)-- 数据类型详解
    redis详解(四)-- 高可用分布式集群
    redis详解(三)
    新工科平台
    关于Nginx的负载均衡
    微信退款回调
  • 原文地址:https://www.cnblogs.com/xyb930826/p/5279297.html
Copyright © 2011-2022 走看看