C#基础笔记 Day3

原创 2015年07月10日 14:26:11

第 7 章:类和对象

匿名类

匿名类的直接意义:根本不知道是什么类型。可以使用 var 关键字将匿名类其声明为隐式类型的变量。

var anonymousObject = new { Name = "John", Age = 47 };

第8章:值和引用

变量(包括类)在声明时初始化。

private关键字创建了不能从类外访问的字段或方法。
创建自同一个类的两个对象,它们分别能访问对方的私有数据。

clone.radius = this.radius;

Circle 类的当前实例能够访问 clone对象的私有 radius 字段。
综上,私有所指的范围是类而不是对象。

可空类型

可用于描述数据库中部分不重要数据为空时的状态。
可空值类型在行为上与普通值类型相似,但可以将 null 值赋给它。
初始化可空值类型时要用问号(?):

int? i = null; 

可以将恰当值类型的表达式直接赋给可空变量。
为了判断可空变量是否包含 null,可采取和引用类型一样的测试办法:

if (i == null)
...

实参调用:ref

需要使用实参调用时,为参数的声明和引用附加ref前缀。

static void pass(ref int param){
    param++;
}
static void Main(){
    int num = 42;
    pass(ref num); 
    ···
}

传递未初始化的实参:out

由方法本身初始化参数,所以调用方法时不需要对实参进行初始化。
为参数的声明和引用附加out前缀。

static void pass(ref int param)
{
    param = 42;
}
static void Main()
{
    int num ;
    pass(ref num); 
    ···

内存管理

“栈”和“堆”这两个词来源于“运行时”的内存管理方式。
栈内存就像一系列堆得越来越高的箱子。调用方法时,它的每个参数都被放入一个箱子,并将这个箱子放到栈的最顶部。每个局部变量也同样分配到一个箱子,并同样放到栈的最顶部。方法结束后,它的所有箱子都从栈中移除。

堆内存则像散布在房间里的一大堆箱子,不像栈那样每个箱子都严格地堆在另一个箱子上方。每个箱子都有一个标签,标记了这个箱子是否正在使用。创建新对象时,“运行时”查找空箱子,把它分配给对象。对对象的引用则存储在栈上的一个局部变量中。“运行时”跟踪每个箱子的引用数量(记住,两个变量可能引用同一个对象)。一旦最后一个引用消失,运行时就将箱子标记为“未使用”。将来某个时候,会清除箱子里的东西,使之能被重用。
这里写图片描述
p.s.这一部分引用自原文。

装箱与拆箱

int i = 42;
object o = i;

i 是值类型,所以它在栈中。如果 o 直接引用 i,那么引用的将是栈。然而,根据内存管理部分笔记,所有对象的引用必须在堆上。
为了解决这类矛盾,实际运行时在堆中分配一小块内存,然后 i 的值被复制到这块内存中,最后让 o 引用该拷贝。
这种将数据项从栈自动复制到堆的行为称为装箱。
装箱完成后栈和堆上的两个暂时相同的值再无关联。
这里写图片描述

为了访问已装箱的值,必须进行强制类型转换。

int i = 42;
object o = i; // 装箱
i = (int)o; //拆箱

假如强制类型转换成功执行,编译器生成的代码会从装箱的 int 中提取出值,这个过程称为拆箱。

两种操作对性能有一定影响。

安全转换数据类型涉及的操作符

is 操作符验证 期望对象的类型。

WrappedInt wi = new WrappedInt();
...
object o = wi;
if (o is WrappedInt) {
WrappedInt temp = (WrappedInt)o; // 安全转型
...
}

is 操作符取两个操作数:左边是对对象引用,右边是类型名称。如果左边的对象是右边的类型,则 is 表达式的求值结果为 true,反之为 false。

as操作符与is类似。

WrappedInt wi = new WrappedInt();
...
object o = wi;
WrappedInt temp = o as WrappedInt;
if (temp != null){
... // 只有转型成功,这里的代码才会执行
}

as 操作符取对象和类型作为左右操作数。“运行时”尝试将对象转换成指定类型。若转换成功,就返回转换成功的结果。转换失败时, as 表达式的求值结果为 null。

版权声明:本文为博主原创文章,未经博主允许不得转载。

30天自制操作系统学习笔记

30天自制操作系统学习笔记 本文大部分内容转自于http://www.mahaixiang.cn/internet/386.html BIOS CMOS等概念部分转自https://zhida...
  • samlqs
  • samlqs
  • 2016年11月18日 20:33
  • 297

java基础面试题:java笔记题收集(一)

1、面向对象的特征有哪些方面?  - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。  - 继承:继...
  • chenpeng19910926
  • chenpeng19910926
  • 2016年08月02日 16:09
  • 558

Python学习day3作业-HAproxy配置文件操作

Python days3作业 作业需求 HAproxy配置文件操作 1. 根据用户输入,输出对应的backend下的server信息 2. 可添加backend 和sever信息...
  • ygqygq2
  • ygqygq2
  • 2016年11月25日 23:22
  • 723

MySQL学习笔记---基础概念和一些基础SQL语句(一)

MySQL学习笔记,以防遗忘 数据库基本概念 数据库:保存有组织的数据的容器(通常是一个文件或一组文件)。 表:某种特定类型数据的结构化清单,数据库中的表都有一个唯一的名字用来标识自己。 模式:关于数...
  • Jung_zhang
  • Jung_zhang
  • 2016年04月14日 20:11
  • 1707

计算机网络基础学习笔记

1.基本概念划分 OIS的七层协议: 应用层、表示层、会话层、运输层、网络层、数据链路层、物理层。    OIS的五层协议: 应用层、运输层、网络层、数据链路层、物理层...
  • basycia
  • basycia
  • 2016年07月11日 13:57
  • 16395

Python3 基础学习笔记

Python3 基础学习笔记这篇博客不是完整的python教程,只是我在学习python3时记下的一些容易忘记的或比较重要的知识点,里面的代码大多是转自 廖雪峰的python3教程 和 菜鸟教程 。不...
  • Cyiano
  • Cyiano
  • 2017年04月10日 19:58
  • 735

ASP.Net MVC开发基础学习笔记(1):走向MVC模式

原文出处: Edison Chou的博客(@周旭龙EdisonChou)    一、ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传...
  • mss359681091
  • mss359681091
  • 2016年04月11日 16:30
  • 695

JAVA零基础学习第一天笔记

Ⅰ.java程序的组织形式:                                 java是一个纯粹的面向对象语言,java程序必须以类(class)的形式存在,在java里面所有的可执...
  • plane_more
  • plane_more
  • 2016年03月18日 10:09
  • 507

oracle基础实战笔记

本文包含以下内容: 1)Centos oracle 11g express安装与使用; 2)oracle最基本的增insert into、删delete、改update set、查select、M...
  • wojiushiwo987
  • wojiushiwo987
  • 2016年04月19日 12:27
  • 1431

【Unity3D】基础知识学习笔记

Unity3D基础知识学习笔记 1、基础知识: 标题栏 菜单栏 工具栏:变换工具、gizmos切换、播放控件、层列表、布局列表 功能窗口 2、资源及资源类型:在project里面能够create的资...
  • woaini454186694
  • woaini454186694
  • 2016年05月25日 22:53
  • 4629
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#基础笔记 Day3
举报原因:
原因补充:

(最多只允许输入30个字)