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

为了让编程更加清晰,把程序中的功能进行模块化划分,每个模块提供特定的功能,而且每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会。 面向对象编程也叫做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<0)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 数组 自定义的类,内置的类)。

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

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

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

时间: 2024-08-04 14:38:38

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

C#中值类型和引用类型

本文将介绍C#类型系统中的值类型和引用类型,以及两者之间的一些区别.同时,还会介绍一下装箱和拆箱操作. 值类型和引用类型 首先,我们看看在C#中哪些类型是值类型,哪些类型是引用类型. 值类型: 基础数据类型(string类型除外):包括整型.浮点型.十进制型.布尔型. 整型(sbyte.byte.char.short.ushort.int.uint.long.ulong ) 浮点型(float 和 double ) 十进制型(decimal ) 布尔型(bool ) 结构类型(struct) 枚

6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱

6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱 引言 本篇文章主要介绍.NET中6个重要的概念:栈,堆,值类型,引用类型,装箱,拆箱.文章开始介绍当你声明一个变量时,编译器内部发生了什么,然后介绍两个重要的概念:栈和堆:最后介绍值类型和引用类型,并说明一些有关它们的重要原理. 最后通过一个简单的示例代码说明装箱拆箱带来的性能损耗. 声明变量的内部机制 在.NET程序中,当你声明一个变量,将在内存中分配一块内存.这块内存分为三部分:1,变量名:2,变量类型:3,变量值. 下图揭示了声

Java中的值类型

在打算了解Java的时候,根据C#的经验,了解一下Java中有哪一些值类型,如何判断某个类型为值类型还是引用类型是一件值得做的事情. 在C#中,值类型存放在栈中,不需要垃圾回收,引用类型存放在堆中,需要垃圾回收.将一个值类型转换为引用类型,会引起装箱(创建一个需要垃圾回收的引用类型),在真正使用时,需要拆箱,在装箱拆箱时会产生需要垃圾回收的对象, 如果装箱拆箱太多,对我们程序的性能有较大影响,所以了解哪些是值类型,哪些是引用类型,以方便在开发中注意区分是很有必要的. 看书是一种方式,自己探索也是

30天C#基础巩固-----值类型/引用类型,泛型,空合并操作符(??),匿名方法

一:值类型/引用类型的区别      值类型主要包括简单类型,枚举类型,和结构体类型等,值类型的实例通常被分配在线程堆栈上面变量保存的内容是实例数据本身.引用类型被分配在托管堆上,变量保存的是地址.引用类型主要包括类类型,接口类型,委托类型和字符串类型等. 关于参数传递,这里有四种:        值类型参数的按值传递:        引用类型参数按值传递: 关于string引用类型参数按值传递的特殊情况:虽然string类型也是引用类型,然而在按值传递时,传递的实参却不会因方法中形参的改变而被

定义值类型

本文引用<CLR Via C#> 设计自己的类型时,要仔细地考虑是否将其定义成值类型,而不是引用类型.某时候,值类型能够提供更好的性能,值类型的主要优势在于它们不作为对象在托管堆上分配. 满足以下全部条件适合将类型定义成值类型: 1. 类型具有基元类型的行为.换言之,这是一个十分简单的类型,其中没有成员会修改类型的任何字段.若一个类型没有提供会更改其字段的成员,就说该类型是不可变类型.事实上,对于许多值类型来说,我们都建议将其所有字段都标记为readonly(只读): 2. 类型不需要从任何类

值类型和引用类型的区别?

1.值类型和引用类型的区别? 1.将一个值类型变量赋给另一个值类型变量时,将复制包含的值.引用类型变量的赋值只复制对对象的引用(快捷方式),而不复制对象本身. 2.值类型不可能派生出新的类型:所有的值类型均隐式派生自 System.ValueType.但与引用类型相同的是,结构也可以实现接口. 3.值类型不可能包含 null 值:然而,可空类型功能允许将 null 赋给值类型. 4.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值. 2.堆和栈的区别? 栈是编译期间就分配好的内存空间,

第5章 基元类型、引用类型和值类型

5.1编程语言的基元类型 编译器(Compiler)直接支持的数据类型称为基元类型(primitive type). 我希望编译器根本不要提供基元类型名称,强制开发人员使用FCL(Framework类库)类型名称: 许多开发人员都困惑于到底应该使用string还是String.由于C#的string直接映射到System.String,所以两者是没有区别的.int始终映射到System.Int32,所以不管在什么操作系统上运行,代表的都是32位整数. 5.2引用类型和值类型 虽然FCL中大多数类

5、C#基础 - C#的值类型

1.C#的值类型 有几个特点: 存储在栈里 基于值类型的变量直接包含值(值类型存储实际值). 将一个值类型变量赋给另一个值类型变量时,将复制包含的值. 这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身. 所有的值类型均隐式派生自 System.ValueType. 与引用类型不同,不能从值类型派生出新的类型. 但与引用类型相同的是,结构也可以实现接口. 与引用类型不同,值类型无法包含 null 值. 但是,可以为 null 的类型 功能允许值类型分配给 null

【转】c#引用类型与值类型的区别大盘点

解析:CLR支持两种类型:值类型和引用类型.用Jeffrey Richter(<CLR via C#>作者)的话来说,“不理解引用类型和值类型区别的程序员将会把代码引入诡异的陷阱和诸多性能问题”.这就要求我们正确理解和使用值类型和引用类型. 值类型包括C#的基本类型(用关键字int.char.float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型):而引用类型包括类(用class关键字声明的类型)和委托(用delegate关键字声明的特殊类).C#中的每