这节讲C#中的类,方法,属性。这是编码中我们最直接打交道的三个结构。

     类:

类(class)是面向对象中最基本的单元,它是一种抽象,对现实世界中事物的抽象,在C#中使用class关键字声明一个类:

class MyClass{}

类既然是一个抽象,我们使用的时候就要对其进行实例化,通过new关键字实例化一个类。

MyClass myclass=new MyClass();

在实例化的同时,我们还可以通过对象初始化器,对类中的属性进行操作。

MyClass myclass=new MyClass(){属性名=属性值}

这对大括号就是对象初始化器,使用对象初始化器,如果使用的构造方法是无参的,那么初始化器之前的小括号可以省略。

每个类都有一个构造方法(constructor),构造方法的名字必须跟类名一致(我们实例类的时候就是调用的这个方法),如果不显式声明类的构造方法,系统就会默认生成一个无参的构造方法。

class MyClass{
public MyClass(){}//构造方法
}

我们可以通过构造方法为类中的成员进行初始化,这其实也是构造方法的很重要的用途。

class MyClass{
public bool isReal;
public MyClass(bool isreal){
this.isReal=isreal;
}//构造方法
}

以上代码中出现了一个关键字this,this是指当前对象,只能用在类的内部,以上代码的意思是这个对象的IsReal属性=isreal。

需要注意的是,在执行类的构造方法之前,会先执行其父类的无参的构造方法,或者,我们指定父类的有参的构造,因为子类继承了父类,在实例化子类的时候,必定要将继承自父类的成员也在内存中创建出来,注意,这并非是实例化父类。

//使用上一节的代码做演示
public class Husky : Dog
{
public Husky() : base("Husky"){}//访问父类的有参构造,初始化属性
}

除了定义一般的类,我们还可以定义静态类,使用static class 声明一个静态类,类中的属性和方法也必须都是静态的。

static class stClass{}

静态类在内存中只有一份,它不需要实例化,在程序的一开始就自动加载,一般静态类都是作为工具类,拿来即用的。调用静态方法,可以使用静态类名.方法名的形式,也可以使用using引入静态类名,就可以省略静态类名,直接调用方法名。

另外,类是可以嵌套的。嵌套的类的作用域就缩小到了外部类的作用域中。

   方法:

方法声明在类的内部,它定义了类的行为,声明一个方法,需要三个必要元素:返回值,方法名,方法参数:

void MyMethod(){}//无参,无返回值的方法
int MyMethodWithOneRetutn(){return 0;}//无参,返回值为int
int MyMethodWithOneArgOneRet(int a){return a+a;}//一个参数,一个返回值

如果一个方法没有返回值,那么它的返回类型就是void,多个参数之间用逗号隔开。方法还有一些前缀,比如访问修饰符,静态修饰符,重写关键字等等。修饰符默认的是private。

方法是可以重载的,所谓重载,就是一个类中可以存在相同方法名的方法,C#中,方法名和参数列表组成一个方法签名,重载一个方法,只需要修改方法签名中的参数列表即可。以下是一组重载方法:

public void RelodeOne(int a){}
public void RelodeOne(int a, int b){}

方法的重载,使一个行为,可以有不同的动作,或者说扩展了一个行为的覆盖面。就好比吃饭(方法名),一个人(一个参数)是吃饭,两个人(两个参数)也是吃饭,行为是一样的,但不同的人数吃饭, 做的菜多少也不一样。

编译器会根据传参的不同调用不同的重载方法。

关于方法,还有一个知识点,叫方法的重写,它跟继承有关,如果想重写父类的方法,那么父类的方法,就要设置为virtual也就是虚方法,子类重写,需要使用关键字override。如果父类不写virtual,子类在重写时需要加上new关键字,下面演示这两种情况:

class OverFather
{
public virtual void isvirtual()
{
Console.WriteLine("我是父类虚方法");
}
public virtual void isold()
{
Console.WriteLine("我是父类老方法");
}
}
class OverWirteMethods : OverFather
{
public void isvirtual()
{
Console.WriteLine("我是子类真方法");
} public new void isold()
{
Console.WriteLine("我是子类新方法");
}
}

在主方法中调用:

OverWirteMethods o = new OverWirteMethods();
o.isvirtual();
o.isold();

属性:

一个类中,除了方法还有属性,方法用来执行动作,属性用来保存数据。属性是个封装结构,它是对外开放的,类中还有一种私有结构,叫字段,属性就像是一个外壳,包裹着字段,不受非法数据的污染。

将一个变量设置为私有的,就可将其称之为字段,然后声明一个属性,来访问和修改这个字段。属性通过get,set块来获取和修改数据。

下面看一个演示:

private bool isFiled;//声明一个字段

public bool IsFiled//声明一个属性
{
get { return isFiled; }//使用get块获取到字段的值
set { value = isFiled; }//使用set块设置字段的值 value是赋过来的值
}

在get,set块中就可以写一些逻辑,处理数据。如果省略其一,就形成了只读或者只写属性。

另外,C#5推出了一个新的语法糖:自动属性:以上代码就可以变化为这样:

public bool IsFiled{get;set;}

自动属性无法对数据做处理,只负责获取或修改,但可以将get或set块设置为私有的,或者也可以不写,自我感觉自动属性就是为了少写代码,没啥特殊的。

 个人公众号,热爱分享,知识无价。

C#中的类、方法和属性的更多相关文章

  1. Java生鲜电商平台-生鲜电商中商品类目、属性、品牌、单位架构设计与实战

    Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战 说明:Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战经验分享 凡是涉及到购物,必然是建立在商品的基础 ...

  2. 关于项目中owl文件中的类定义和属性定义

    <owl:Class rdf:about="www.isinonet.com/insider#XXX"> <rdfs:label>name</rdfs ...

  3. 第8.32节 Python中重写__delattr__方法捕获属性删除

    一. 引言 上节介绍了__delattr__方法在Python清除实例属性时被捕获执行,本节结合例子介绍重写__delattr__方法,并说明__delattr__方法执行的触发逻辑. 二. 重写__ ...

  4. U3D中的一些方法和属性

    string.Format();//拼接字符串的方法,里面可用占位符,方法内部为string Destroy(Object obj);//立刻销毁(游戏对象,组件或者asset) Destroy(Ob ...

  5. numpy中的ndarray方法和属性

    原文地址 NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推.在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量.比如说,二维数组相当于是 ...

  6. mybatis中实体类跟数据库属性不一致解决方案

    1.在Mapper.xml映射配置文件中给sql语句起别名 select id as uid,username as name from user 2.mybatis中可以单独的配置查询结果的列名和实 ...

  7. PyQt(Python+Qt)学习随笔:Designer中ItemViews类部件frameShape属性

    老猿Python博文目录 老猿Python博客地址 frameShape属性是从QFrame继承的属性,对应类型为QFrame.Shape,该属性表示框架样式中的框架形状,有如下取值: 老猿Pytho ...

  8. day20-Python运维开发基础(装饰器 / 类中的方法 / 类的方法变属性)

    1. 装饰器 / 类中的方法 / 类的方法变属性 # ### 装饰器 """ 定义:装饰器用于拓展原来函数功能的一种语法,返回新函数替换旧函数 优点:在不更改原函数代码的 ...

  9. JavaScript常用对象的方法和属性

    ---恢复内容开始--- 本文将简单介绍JavaScript中一些常用对象的属性和方法,以及几个有用的系统函数. 一.串方法 JavaScript有强大的串处理功能,有了这些串方法,才能编写出丰富多彩 ...

随机推荐

  1. P1089_津津的储蓄计划(JAVA语言)

    package 顺序与分支; /* * 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱, 津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄, ...

  2. 2019_西湖论剑_预选赛 testre

    2019_西湖论剑_预选赛 testre 程序中关键操作是比较ptr,其中夹杂的一部分v26计算是为了混淆我们的分析.那么我们只要跟踪ptr数组的生成便可,向上发现v11,加密操作数组. 接下来跟踪v ...

  3. Hadoop集群--linux虚拟机Hadoop安装与配置、克隆虚拟机

    Hadoop集群 第四章 Hadoop安装与配置.克隆虚拟机 一.Hadoop安装与配置 1.将hadoop安装包通过Xftp传输到虚拟机的/software目录下 2.进入/software目录下, ...

  4. vue 快速入门 系列 —— 初步认识 vue

    其他章节请看: vue 快速入门 系列 初步认识 vue vue 是什么 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架. 所谓渐进式,就是你可以一步一步.有阶段 ...

  5. Redis主从&哨兵集群搭建

    主从集群 在搭建主从集群前,我们先把Redis安装起来: #解压Redis压缩包 [root@master lf]# tar -zxvf redis-6.2.1.tar.gz -- #安装gcc [r ...

  6. @PostConstruct 使用记录

    @PostConstruct 从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct.这 ...

  7. JS基础学习第二天

    类型转换 类型转换就是指将其他的数据类型,转换为String Number 或 Boolean 转换为String 方式一(强制类型转换): 调用被转换数据的toString()方法例子:var a ...

  8. 消息队列高手课,带你从源码角度全面解析MQ的设计与实现

    消息队列中间件的使用并不复杂,但如果你对消息队列不熟悉,很难构建出健壮.稳定并且高性能的企业级系统,你会面临很多实际问题: 如何选择最适合系统的消息队列产品? 如何保证消息不重复.不丢失? 如果你掌握 ...

  9. 它来了,它来了,HarmonyOS应用开发在线体验来了

    接下来是我们的两分钟科普,一分钟玩转HarmonyOS应用开发在线体验,一分钟简单了解"一次开发.多设备部署"的原理.萌新的开发者也能第一时间掌握,往下看吧~ 一分钟玩转Harmo ...

  10. C程序数组算法 — 冒泡法排序【前冒 || 后冒】

    第一种写法(前冒泡): /* C程序数组算法 - 冒泡法排序 * 此例子按照 大 -> 小 排序 * 原理:两两相比较,然后进行大小对调 * 比较次数: n^2 次 * 说明:冒泡排序是相对稳定 ...