C#高级编程笔记之第三章:对象和类型
3.2 类和结构
类与结构的区别是它们在内存中的存储方式、访问方式(类似存储在堆上的引用类型,而结构是存储在栈上的值类型)和它们的一些特征。
语法上,类与结构非常相似,主要区别是结构使用关键字 struct 代替 class 来声明。
3.3 类成员
3.3.1 数据成员
数据成员是包含类数据—字段、常量和事件的成员。
3.3.2 函数成员
函数成员提供了操作类中数据的某些功能,包括方法、属性、构造函数和析构函数(终结器)、运算符以及索引器。
- 方法
ref 和 out 的区别:
ref 在传递之前必须已经被初始化,out 则不要求。
ref 的实质是将值类型进行引用传递,而 out 是为了增加返回值。
命名参数:在传递参数的过程中可以指定其名字,格式为 MethodName (ParameterName : Value )
Params 关键字 : 必须在方法参数的最后面。
方法的重载:不能仅在返回类型上有区别,不能仅根据声明 ref 、 out 或 params 之间区分。
- 属性
概念:属性是一个或一对方法,在客户端代码看来,它(们)是一个字段。
get访问器不带任何参数,且返回属性声明的类型。
set访问器带一个value参数,其类型与声明的类型相同。
属性的访问修饰符:在get和set访问器中,必须有一个具备属性的访问级别。
- 构造函数
声明构造方式就是声明一个与包含的类同名的方法,但该方法没有返回值。
如果提供了带参数的构造函数,编译器就不会自动提供默认的构造函数。
(1)静态构造函数
编写静态构造函数的原因:类中有一些静态字段或属性,需要在第一次使用类之前,从外部源中初始化这些字段和属性。
.NET运行库没有确保什么时候去执行静态构造函数,所以不应该要求在某个特定时刻执行静态构造函数中的代码。但可以确保的是,它在所有引用前只会调用一次。
无参构造函数可以与静态构造函数在同一个类中定义。
(2)从构造函数中调用其它构造函数
base 与 this 关键字
3.3.3 只读字段
readonly 与 const 的区别:
readonly 可以在构造函数中赋值,而 const 哪里都不能赋值,只能初始化。
3.4 匿名类型
var 和 new 关键字一起使用可以创建匿名类型,例如。
static void Main(string[] args)
{
};
Console.WriteLine(test.ToString());
Console.WriteLine(test.Name.GetType().ToString());
Console.WriteLine(test.Age.GetType().ToString());
Console.ReadKey();
}
输出结果如下:

我们并不知道这个对象的类型,编译器为其“伪造”了一个名称,但是只有编译器才能使用它,我们不能也不应该使用新对象上的任何类型反射,因为这不会得到一致的结果。
3.5 结构
- 结构是值类型,不是引用类型,其生命周期的限制与简单的数据类型一样,传递结构时可以使用ref关键字来减少性能损耗。
- 结构一般用于表达简单的组合数据。
- 结构不支持继承,但所有结构都继承于System.ValueType,而System.ValueType又继承于System.Object。
- 使用结构,可以指定字段如何在内存中布局。
- 对于结构,编译器总是提供默认无参构造函数,它不允许被替换,也不能在结构中为字段提供初始值,必须在构造函数中提供。
- 结构中的公有字段为可接受的编程方式。
- 在定义结构时使用new关键字只不过是用于调用其构造函数,变量的声明实际上才是为结构分配空间,所以以下代码不被报错。
MyStruct myStruct /*= new MyStruct()*/; 2 myStruct.Name = "Earl Jones"; myStruct.Age = ;
覆盖结构默认的构造函数会报错:

3.6 弱引用
在代码中实例化一个类或结构时,只要有代码引用它,就会形成强引用。
强引用和弱引用的区别是,强引用只要有引用就不会被GC回收,而弱引用随时都可能被GC回收,所以使用它的时候必须确定其是否存活。如:
MyClass myClass;
WeakReference weakMyClass = new WeakReference(new MyClass());
if (weakMyClass.IsAlive)
{
myClass = weakMyClass.Target as MyClass;
Console.WriteLine(myClass.value);
}
3.7 部分类
Partial关键字可以允许把类、结构、方法或结构放在多个文件中。
如果声明类似使用了下面的关键字,这些关键字就必须应用于同一个类的所有部分:
- 访问修饰符
- abstract
- sealed
- new
- 一般约束
3.9 Object类
所有类都继承自System.Object类。
方法:
- ToString();
- GetHashCode();
- Equals();这里有三个比较三个用于比较对象相等性的方法。
- Finalize();
- GetType();
- GMemberwiseClone();
3.10 扩展方法
扩展方法用于在某些不能直接修改源代码中的类中添加方法。
using System;
namespace 扩展方法
{
class Program
{
static void Main(string[] args)
{
MyClass myClass1 = new MyClass();
myClass1.SayHiToSomeone();
myClass1.SayHi();
Console.ReadKey();
}
}
class MyClass
{
public void SayHi()
{
Console.WriteLine("我是最原始的方法");
}
}
static class AddMyClass
{
static public void SayHiToSomeone(this MyClass myClass)
{
Console.WriteLine("我是一个扩展方法");
}
static public void SayHi(this MyClass myClass)
{
Console.WriteLine("我是扩展方法SayHi");
}
}
}
输出的结果:

由上得出:
- 扩展方法必须定义在一个静态类中。
- 扩展方法的第一个参数为放在 this 后的类,这个方法就是这个类的一部分。
- 即是扩展方法是一个静态方法,也要使用调用实例方法的语法经行调用。
- 如果扩展方法与类中某个方法同名,就从来不会调用扩展方法。
本文部分摘录自C#高级编程第九版,其余由Earl Jones整理及总结而成,本人能力有限,如有纰漏望及时指出。
如果你喜欢此书,或想了解更详细内容,请购买正版书籍进行查阅。
转载请注明出处。
C#高级编程笔记之第三章:对象和类型的更多相关文章
- c#高级编程第七版 学习笔记 第三章 对象和类型
第三章 对象和类型 本章的内容: 类和结构的区别 类成员 按值和按引用传送参数 方法重载 构造函数和静态构造函数 只读字段 部分类 静态类 Object类,其他类型都从该类派生而来 3.1 类和结构 ...
- 解读经典《C#高级编程》第七版 Page79-93.对象和类型.Chapter3
前言 本篇我们继续讲解本章其余的部分:构造函数.只读字段.匿名类型.结构详解.部分类.静态类.Object类.扩展方法,等. 01 类 构造函数 构造函数是一种特殊的方法: 与类同名 没有返回值,甚至 ...
- 【读书笔记】C#高级编程 第三章 对象和类型
(一)类和结构 类和结构实际上都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法. 类和结构的区别:内存中的存储方式.访问方式(类是存储在堆上的引用类型,结构是存储在栈的值类型)和它 ...
- 解读经典《C#高级编程》第七版 Page68-79.对象和类型.Chapter3
前言 新年好,本篇开始进入第三章,<对象和类型>,深刻理解C#的对象,对于使用好.Net类库非常重要. 01 类和结构 从使用角度看,结构和类的区别很小,比如,将结构定义转换为类,只需要将 ...
- 《Java并发编程实战》第三章 对象的共享 读书笔记
一.可见性 什么是可见性? Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化. 后者就是可见 ...
- ASP.NET MVC5 高级编程-学习日记-第三章 视图
开发人员之所以花费大量时间来重点设计控制器和模型对象,是因为在这些领域中,精心编写的整洁代码是开发一个可维护Web应用程序的基础. 3.1 视图的作用 视图的职责是向用户提供用户界面.当控制器针对被请 ...
- C#高级编程笔记(11至16章)异步/托管/反射/异常
11.1.2LINQ语句 LINQ查询表达式以from子句开始,以select或者group子句结束.在这两个子句之间可以跟零个或者多个from.let.where.join或者orderby子句. ...
- java并发编程实战:第三章----对象的共享
我们不仅仅希望防止某个线程使用某个状态时,另一个线程在修改它:我们还希望某个线程修改了某个状态后,其他线程能够看到状态的变化. 一.可见性 重排序:在没有同步的情况下,编译器.处理器可能对代码的执行顺 ...
- Android高级编程笔记(四)深入探讨Activity(转)
在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...
随机推荐
- (NO.00002)iOS游戏精灵战争雏形(七)
接上一篇博文,我们继续完成射击的功能. 还是在MainScene.m中,添加initBullets方法: -(void)initBullets{ CCSprite *bullet; for (int ...
- 访问日志IO性能优化
在高并发量的场景下磁盘IO往往是性能的瓶颈所在,访问日志涉及到频繁的写操作,所以这部分要尽可能地优化,不然将拖累系统的整体性能.针对文件记录及数据库记录两种方式可以有以下措施提高写性能, l 避免频繁 ...
- Leetcode_9_Palindrome Number
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41598031 Palindrome Number Dete ...
- C++ Primer 有感(标准库类型)
1.当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的: string s1= "hello"; sring s2=&quo ...
- mysql进阶(十九)SQL语句如何精准查找某一时间段的数据
SQL语句如何精准查找某一时间段的数据 在项目开发过程中,自己需要查询出一定时间段内的交易.故需要在sql查询语句中加入日期时间要素,sql语句如何实现? SELECT * FROM lmapp.lm ...
- ffplay的快捷键以及选项
ffplay是ffmpeg工程中提供的播放器,功能相当的强大,凡是ffmpeg支持的视音频格式它基本上都支持.甚至连VLC不支持的一些流媒体都可以播放(比如说RTMP),但是它的缺点是其不是图形化界面 ...
- Android下用Activity实现圆角的自定义弹窗
这里我们使用9patch制作一个背景,找到SDK目录下的tools目录,双击draw9patch.bat文件,如下图: 打开想要编辑的文件,进行编辑(9patch的编辑教程自寻). 编辑完成后,保存到 ...
- android ViewPager+Fragment之懒加载
说说写这篇博客的背景吧,前两天去面试,问到一个问题说的是:比如我们首页,是有3个fragment构成的,并且要是实现作用可以滑,那么这个最好的选择就是ViewPager+fragment了,但是我们知 ...
- FFMPEG结构体分析:AVIOContext
注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...
- 色彩转换——RGB & HSL
RGB to HSL The R,G,B values are divided by 255 to change the range from 0..255 to 0..1: R' = R/255 G ...