为了让编程更加清晰,把程序中的功能进行模块化划分,每个模块提供特定的功能,而且每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会。 面向对象编程也叫做OOP编程 简单来说面向对象编程就是结构化编程,对程序中的变量结构划分,让编程更清晰。

类的概念:

类实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法。 类定义了类的每个对象(称为实例)可以包含什么数据和功能。

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

数据成员: 数据成员是包含类的数据--字段,常量和事件的成员。

函数成员: 函数成员提供了操作类中数据的某些功能。(方法,属性,构造方法和终结器(析构方法),运算符,和索引器)

字段的声明:访问修饰符 类型 字段名称;

方法的声明:访问修饰符 返回值类型 方法名称(参数){ //方法体 }

定义一个类来表示一个顾客:

class Customer{
public string name;
public string address;
public int age;
public string buyTime;
public void Show(){
Console.WriteLine("名字:"+name);
Console.WriteLine("年龄:"+age);
Console.WriteLine("地址:"+address);
Console.WriteLine("购买时间:"+buyTime);
}
}
在这里我们定义了一个类,叫做Customer(顾客),里面包含了四个字段,存储了顾客的名字,年龄,地址和购买时间,包含了一个Show()方法,用来输出自身的一些信息的,在这里Customer就是一个新的数据类型
类似于结构体的定义
struct Customer......;

如何利用类创建对象:

使用我们自定义的类声明的变量也叫做对象,这个过程也叫做实例化。

ClassName myClass = new ClassName();

其中ClassName是我们定义的类的名字,myClass是我们声明的变量(对象)的名字,后面的new是一个关键字,使用new 加上类型名()表示对该对象进行构造,如果不进行构造的话,这个对象是无法使用的。

构造函数:

我们构造对象的时候,对象的初始化过程是自动完成的,但是在初始化对象的过程中有的时候需要做一些额外的工作,例如需要初始化对象存储的数据,构造函数就是用于初始化数据的函数。

声明基本的构造函数的语法就是声明一个和所在类同名的方法,但是该方法没有返回类型。

public class MyClass{

public MyClass()

{ 这个构造函数的函数体 }

}

当我们使用new关键字创建类的时候,就会调用构造方法。 我们一般会使用构造方法进行初始化数据的一些操作。 构造函数可以进行重载,跟普通函数重载是一样的规则

注意: 当我们不写,任何构造函数的时候,编译器会提供给我们一个默认的 无参的构造函数,但是如果我们定义了一个或者多个构造函数,编译器就不会再提供默认的构造函数

属性的定义:

属性的定义结构:

public int MyIntProp{
get{
// get code
}
set{
//set code
}
}

1,定义属性需要名字和类型

2,属性包含两个块 get块和set块

3,访问属性和访问字段一样,当取得属性的值的时候,就会调用属性中的get块,所以get块,类型需要一个返回值就是属性的类型;

当我们去给属性设置值的时候,就会调用属性中的set块,我们可以在set块中通过value访问到我们设置的值。

通过属性来访问字段:

我们习惯上把字段设置为私有的,这样外界不能修改字段的值,然后我们可以通过定义属性来设置和取得字段中的值。

private int age;
public int Age{//习惯上属性大写 字段小写
set{
if(value<)return;
age = value;
}
get{
return age;
}
}

设置属性的只读或者只写:

private string name;
public string name{
get{
return name;
}
}
属性可以值只提供一个set块或者get块

属性的访问修饰符:

public string name{
get{
return name;
}
private set{
name = value;
}
}

自动实现的属性:

public int Age{get;set;}
编译器会自动创建private int age属性

匿名类型(var):

我们创建变量(对象的时候),必须指定类型,其实我们也可以不去指定类型,这个就是匿名类型,我们可以使用var声明一个匿名类型。 使用var声明的匿名类型,当初始化的时候,这个变量的类型就被确定下来,并且以后不可以修改。

var var1 = 34;

堆和栈 : 程序运行时的内存区域

我们把内存分为堆 空间和栈空间

栈空间比较小,但是读取速度快 堆空间比较大,但是读取速度慢

栈的特征: 数据只能从栈的顶端插入和删除 把数据放入栈顶称为入栈(push) 从栈顶删除数据称为出栈(pop)[后进先出]

堆是一块内存区域,与栈不同,堆里的内存能够以任意顺序存入和移除

GC Garbage Collector垃圾回收器:

CLR的GC就是内存管理机制,我们写程序不需要关心内存的使用,因为这些都是CLR帮我们做了。

值类型和引用类型:

类型被分为两种:值类型(整数,bool struct char 小数)和引用类型(string 数组 自定义的类,内置的类)。

值类型只需要一段单独的内存,用于存储实际的数据,(单独定义的时候放在栈中)

引用类型需要两段内存 第一段存储实际的数据,它总是位于堆中 第二段是一个引用,指向数据在堆中的存放位置

当我们使用引用类型赋值的 时候,其实是赋值的引用类型的引用 如果数组是一个值类型的数组,那么数组中直接存储值,如果是一个引用类型的数组(数组中存储的是引用类型),那么数组中存储的是引用(内存地址)

定义类+类实例化+属性+构造函数+匿名类型var+堆与栈+GC回收机制+值类型与引用类型的更多相关文章

  1. C++ : 从栈和堆来理解C#中的值类型和引用类型

    C++中并没有值类型和引用类型之说,标准变量或者自定义对象的存取默认是没有区别的.但如果深入地来看,就要了解C++中,管理数据的两大内存区域:栈和堆. 栈(stack)是类似于一个先进后出的抽屉.它的 ...

  2. php类知识点滴---类的实例化,构造函数,继承初步

    实例化类----黑科技用法,通过字符串来实例化 class coach { public function __construct() { echo "欢迎光临北武堂"." ...

  3. C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)

    前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处. 本文的重点就是:值类型直接存储其值,引 ...

  4. c# 所有类型都是从object继承,那么值类型默认也有装箱吗?

    我们知道,c#所有类型都是从System.Object继承,int等值类型也逃脱不了这种命运,那难道值类型默认有装箱操作吗?答案是否,在CLR via这本书中有简短的解释说明: 1.值类型从Syste ...

  5. ES之值类型以及堆和栈

    ES的数据类型: 原始类型(值存在栈内存中): Number.String Boolean.undefined.null charAt(index)返回该index所在的字节,charCodeAt(i ...

  6. 【CLR Via C#】第5章 基元类型、引用类型、值类型

    第二遍看这本书,决定记录一下加深印象. 1,基元类型 什么事基元类型?基元类型是直接映射到FrameWork类库(FCL)中存在的类型,编译器直接支持的数据类型.比如int直接映射到System.In ...

  7. C#中值类型和引用类型

    本文将介绍C#类型系统中的值类型和引用类型,以及两者之间的一些区别.同时,还会介绍一下装箱和拆箱操作. 值类型和引用类型 首先,我们看看在C#中哪些类型是值类型,哪些类型是引用类型. 值类型: 基础数 ...

  8. c#基础系列1---深入理解值类型和引用类型

    "大菜":源于自己刚踏入猿途混沌拾起,自我感觉不是一般的菜,因而得名"大菜",于自身共勉. 不知不觉已经踏入坑已10余年之多,对于c#多多少少有一点自己的认识, ...

  9. c#值类型引用类型第一章

    概要 本篇文章主要简单扼要的讲述值类型和引用类型更进阶的理解和使用.如果希望更多的了解和技术讨论请记得看文章末尾,望各位看官多多支持多多关注,关注和支持是我更新文章的最大动力.在这里谢谢大家.温馨提示 ...

随机推荐

  1. 【转】hibernate中的映射文件xxx.hbm.xml详解总结

    一.Hibernate映射文件的作用: Hibernate映射文件是Hibernate与数据库进行持久化的桥梁 二,Hibernate映射文件主要内容:     (1).映射内容的定义: Hibern ...

  2. Java8 FutureTask 分析

    实现FutureTask的要点 1.需要实现一个链表(每个节点包含当前线程的引用) 2.通过LockSupport.park 对线程进行阻塞 3.节点的唤醒(task完成, 线程Interrupt, ...

  3. 解决You are using pip version 9.0.1, however version 9.0.3 is available. You should consider upgra

    直接运行命令:python -m pip install --upgrade pip

  4. 004-搭建框架-实现AOP机制【一】代理技术

    前景提要 监控方法性能.执行时间.记录日志等 AOP( Aspect Oriented Programming)面向方面编程. 在AOP中,需要定义一个Aspect(切面)类来编写需要横切业务的逻辑代 ...

  5. PhoneGap 兼容IOS上移20px(包括启动页,拍照)

    引自:http://stackoverflow.com/questions/19209781/ios-7-status-bar-with-phonegap 情景:在ios7下PhoneGap app会 ...

  6. lambda可调用对象

    //find_if谓词使用 bool isShorter(const string &s1, const string &sz){ return s1.size() < sz.s ...

  7. linux中安装php

    1.在php官网找到对应的php版本下载下来(php官网地址http://php.net) 2.把下载下来的安装包放入到linux系统中 3.解压php压缩包,通过tar -zxvf  +  下载下来 ...

  8. I.mx6s上移植wm8960驱动(基于linux3.0.101版本)

    I.mx6s上移植wm8960驱动   此篇博文只记录移植的步骤,其他不做分析.首先上一张wm8960的硬件连接图: 1  上电操作   配置wm8960的上电脚,文件位置:arch/arm/mach ...

  9. 【Head First Servlets and JSP】笔记5:HttpServletResponse resp

    [HttpServletResponse resp] [由servlet处理响应] 1.一般可以用通过resp获得一个输出流(writer),然后通过输出流将HTML写入响应.例如: resp.set ...

  10. [SCOI2005]超级格雷码

    题目 BZOJ 洛谷 做法 爆搜真有意思 满足不重复且异或后仅一位为\(1\) 利用奇偶性交叉搜索(仅改变一位) My complete code #include<bits/stdc++.h& ...