第三章 对象和类型

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

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

C#高级编程 (第六版) 学习 第三章:对象和类型的更多相关文章

  1. C#高级编程 (第六版) 学习 第七章:委托和事件

    第七章 委托和事件 回调(callback)函数是Windows编程的一个重要方面,实际上是方法调用的指针,也称为函数指针. .Net以委托的形式实现了函数指针的概念,.Net的委托是类型安全的. 委 ...

  2. C#高级编程 (第六版) 学习 第五章:数组

    第五章 数组 1,简单数组 声明:int[] myArray; 初始化:myArray = new int[4]; 为数组分配内存. 还可以用如下的方法: int[] myArray = new in ...

  3. C#高级编程 (第六版) 学习 第四章:继承

    第四章 继承 1,继承的类型 实现继承: 一个类派生于一个基类型,拥有该基类型所有成员字段和函数. 接口继承 一个类型只继承了函数的签名,没有继承任何实现代码.   2,实现继承 class MyDe ...

  4. C#高级编程 (第六版) 学习 第六章:运算符和类型强制转换

    第六章 运算符和类型强制转换 1,运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ ...

  5. C#高级编程 (第六版) 学习 第一章:.Net体系结构

    第一章 .Net体系结构 1,公共语言运行库(Common Language Runtime, CLR) .Net Framework的核心是其运行库的执行环境,称为公共语言运行库,或.Net运行库. ...

  6. C#高级编程(第六版)学习:第三十一章:Windows窗体

    第三十一章 Windows窗体 创建Windows窗体应用程序 在文本编辑器中输入: /* * form.cs * a simple windows form * */ using System; u ...

  7. C#高级编程 (第六版) 学习 第二章:C#基础

    第二章 基础 1,helloworld示例: helloworld.cs using System; using System.Collections.Generic; using System.Li ...

  8. c#高级编程第七版 学习笔记 第一章 .NET体系结构

    第一章      .NET体系结构 本章内容: 编译和运行面向.NET的代码 Microsoft中间语言(Microsoft Intermediate Language,MSIL或简称IL)的优点 值 ...

  9. c#高级编程第七版 学习笔记 第二章 核心c#

    第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...

随机推荐

  1. python教程(八)·文件操作

    由于离高考越来越近,博主打算本篇文章过后,暂停本系列教程的更新,等到高考完后再继续本系列教程,请谅解! 这次我们学习用python操作文件,包括文件的读.写等-- 操作文件第一步--打开文件 要想操作 ...

  2. 编写DVWA暴力破解High级别的Python脚本

    1. 过程(不查看源代码) 使用burpsuite或者owasp zap抓取数据包,可以看出页面执行过程如下: 首先获取上一次请求的token,然后sleep几秒,最后使用get方法提交验证. 2. ...

  3. 开了几天的phpmyadmin的总结

    近来无事,免费体验了一波腾讯云的vps,打了一个phpstudy,全部默认的配置,只不过,没有给他写入文件的权限 开启了日志,看了下,这几天黑客们的活动 首先,有两三个ip来爆破我的phpmyadmi ...

  4. poj 2349 Arctic Network(prime)

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25165   Accepted: 7751 Description The ...

  5. Hystrix使用

    Hystrix是Netflix开源的一款容错系统,能帮助使用者码出具备强大的容错能力和鲁棒性的程序.如果某程序或class要使用Hystrix,只需简单继承HystrixCommand/Hystrix ...

  6. IDEA新建Web项目

    file->New project->输入项目名(例如这里输入HelloWeb) 选择JDK为合适版本->next ->finish即可 在新建的项目HelloWorld上右击 ...

  7. 虚拟机安装与Linux命令的学习 ——20155215宣言

    一.虚拟机的安装 虚拟机的安装对我来说真可谓是一波三折.打开老师发布的安装教程,简单地浏览了一下,主要步骤都有图文解说.我本来以为这个安装按部就班即可,可哪知道,问题一个接着一个出现. 问题1 在我下 ...

  8. C#基础之反射

    虽然还在学校读书,反射实际写的不多.但感觉反射在程序开发中用得还是挺多的,对我来说也是.NET中的一个难点.通过反射,我们可以在运行时获得.NET中的每一个类型的成员,这些类型包括类.结构.委托和枚举 ...

  9. 【MySQL函数】日期篇

    1.date_format()函数 date_format(createtime,'%Y') 年 date_format(createtime,'%Y-%m') 年月 date_format(crea ...

  10. vscode eslint格式化配置

    { // vscode默认启用了根据文件类型自动设置tabsize的选项 "editor.detectIndentation": false, // 重新设定tabsize &qu ...