第三章 对象和类型
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#高级编程 (第六版) 学习 第三章:对象和类型的更多相关文章
-
C#高级编程 (第六版) 学习 第七章:委托和事件
第七章 委托和事件 回调(callback)函数是Windows编程的一个重要方面,实际上是方法调用的指针,也称为函数指针. .Net以委托的形式实现了函数指针的概念,.Net的委托是类型安全的. 委 ...
-
C#高级编程 (第六版) 学习 第五章:数组
第五章 数组 1,简单数组 声明:int[] myArray; 初始化:myArray = new int[4]; 为数组分配内存. 还可以用如下的方法: int[] myArray = new in ...
-
C#高级编程 (第六版) 学习 第四章:继承
第四章 继承 1,继承的类型 实现继承: 一个类派生于一个基类型,拥有该基类型所有成员字段和函数. 接口继承 一个类型只继承了函数的签名,没有继承任何实现代码. 2,实现继承 class MyDe ...
-
C#高级编程 (第六版) 学习 第六章:运算符和类型强制转换
第六章 运算符和类型强制转换 1,运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ ...
-
C#高级编程 (第六版) 学习 第一章:.Net体系结构
第一章 .Net体系结构 1,公共语言运行库(Common Language Runtime, CLR) .Net Framework的核心是其运行库的执行环境,称为公共语言运行库,或.Net运行库. ...
-
C#高级编程(第六版)学习:第三十一章:Windows窗体
第三十一章 Windows窗体 创建Windows窗体应用程序 在文本编辑器中输入: /* * form.cs * a simple windows form * */ using System; u ...
-
C#高级编程 (第六版) 学习 第二章:C#基础
第二章 基础 1,helloworld示例: helloworld.cs using System; using System.Collections.Generic; using System.Li ...
-
c#高级编程第七版 学习笔记 第一章 .NET体系结构
第一章 .NET体系结构 本章内容: 编译和运行面向.NET的代码 Microsoft中间语言(Microsoft Intermediate Language,MSIL或简称IL)的优点 值 ...
-
c#高级编程第七版 学习笔记 第二章 核心c#
第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...
随机推荐
-
js写的ajax
1.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8& ...
-
Thinking in Java 学习笔记(一)
chapter_01 对象导论 1.1 Java语言基础Smalltalk的特性: 万物皆对象 可以将对象视为一种奇特的变量,它可以存储数据(成员变量),也可以在自身上执行操作(方法). 程序对象 ...
-
background-size背景缩放
特别注意:背景图片缩放是相对于背景图片所在容器的宽高而言的,并不是相对背景图片本身的宽高 比如,一个div的宽高是300和200像素,背景图片本身的宽高是100*100的像素,设置div的backgr ...
-
android里R.layout.的问题
今天,在Exlipse里的一个项目在.java文件里写 setContentView(R.layout.activity_problem);时,显示错误,以为是R.java文件里没有对应的activ ...
-
JS闭包(转载加整理)
原文地址:http://www.jb51.net/article/24101.htm 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量 ...
-
暑假训练round 3 题解
今天做题运气出奇的好,除了几处小错误调试之后忘记改掉了……最后还AK了……虽然题目不难,学长也说是福利局,但是对个人的鼓励作用还是挺大的……至此暑假训练就结束了,也算没有遗憾……. 题解如下: Pro ...
-
cocos2dx 3.x(一张背景图利用定时器实现循环轮播)
// // MainScene.hpp // helloworld // // Created by apple on 16/9/19. // // #ifndef MainScene_hpp #de ...
-
解决virtualbox 虚拟机不能ping通win7
凭经验猜测是由于防火墙引起的,关闭防火墙再ping,果然可行.google说这是由于“win7 防火墙默认的禁ping策略”引起的.但是关闭防火墙很不安全,可以按照以下步骤为防火墙添加入站规则来解决问 ...
-
Python实战之dict简单练习
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__forma ...
-
Android 框架练成 教你打造高效的图片加载框架
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41874561,本文出自:[张鸿洋的博客] 1.概述 优秀的图片加载框架不要太多, ...