这节讲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引入静态类名,就可以省略静态类名,直接调用方法名。

使用abstract class 创建一个抽象类,抽象类顾名思义是对类的抽象,抽象类中可以定义抽象方法(抽象方法的定义也是需要加上abstract关键字,抽象方法不能定义为私有的,私有的抽象方法是无意义的),也可以定义非抽象方法,它的作用就是将类中的成员进行抽象,以便更好地实现多态。包含了抽象方法的类必须要定义成抽象类,抽象类只能被继承,不能被实例,它就像一个骨架一样,具体的填充需要交给它的子类。

abstract class IsAbstruct//定义抽象类{    public abstract void Shout ();//定义抽象方法}

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

跟类有关的还有一个原则:单一职责原则(Single Responsibility Principle),单一职责原则讲的是一个类应该只有一个发生变化的原因(动机),可以设想一个情景,开高铁的人没法很好的开汽车,因为两者的工作原理不一样。当一个类服务两个不太相关的业务,那么这个类就拥有多个职责,我们就会有多个动机去改变它,这样的类就违反了单一职责原则。

   方法:

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

void MyMethod(){}//无参,无返回值的方法int MyMethodWithOneRetutn(){return 0;}//无参,返回值为intint 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;}

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

本节到此结束...

@data 重写set方法_C#中的类、方法和属性相关推荐

  1. C# 子类实例化基类 基类使用不了子类的方法_C#中的类、方法和属性

    这节讲C#中的类,方法,属性.这是面向对象编程中,我们最直接打交道的三个结构.    类: 类(class)是面向对象中最基本的单元,它是一种抽象,对现实世界中事物的抽象,在C#中使用class关键字 ...

  2. python new方法_Python中的__new__()方法的使用

    __new__() 函数只能用于从object继承的新式类. 先看下object类中对__new__()方法的定义: class object: @staticmethod # known case ...

  3. models.py 文件中的类及相关属性

    models中的类以及相关属性 #作者表 class Author(models.Model):name = models.CharField(max_length=16)#作者和作者详细表一对一关联 ...

  4. java object 方法_Java中Object类常用的12个方法,你用过几个?

    前言 Java 中的 Object 方法在面试中是一个非常高频的点,毕竟 Object 是所有类的"老祖宗".Java 中所有的类都有一个共同的祖先 Object 类,子类都会继承 ...

  5. java中string的方法_java中String类中的常用方法

    @Test public void testToString2() {  /**   * 他会调用toString方法 他调用的其实是Object类中的toString方法 引用会隐式调用toStri ...

  6. fileinfo什么意思_C中File类和FileInfo类有什么区别?

    参考答案如下 类和类C中File类和FileInfo类有什么区别? 区别成都社会保险的问题 类和类请教:2011四川会计从业<会计基础>密押试卷(8)第3大题第5小题如何解答? 区别请教: ...

  7. java中math的方法_Java中Math类常用方法代码详解

    近期用到四舍五入想到以前整理了一点,就顺便重新整理好经常见到的一些四舍五入,后续遇到常用也会直接在这篇文章更新... public class Demo{ public static void mai ...

  8. python中的类实例的属性查找过程

    __getattr__.__getattribute__对属性查找的影响 没有__getxxx__的例子 class Book:press = "人民邮电出版社"class Lan ...

  9. python中的str方法和repr方法_Python中 的 __str__ 方法和 __repr__ 方法的区别有哪些

    Python中 的 __str__ 方法和 __repr__ 方法的区别有哪些 发布时间:2020-11-05 17:11:48 来源:亿速云 阅读:95 作者:Leah 本篇文章给大家分享的是有关P ...

最新文章

  1. 'CUDA driver version is insufficient for CUDA runtime version
  2. 秀操作:函数宏的三种封装方式
  3. 【单调栈】最长不下降子序列变式
  4. python语法注释原则
  5. php实现语音留言,iPhone实现语音留言 新技能get
  6. Atitit api与安全措施法 目录 1.1. 模板替换 sprintf %f %d 数字小数字段格式化转换校验法 1 2.  $pdo-exec 与query 2 2.1. 数字校
  7. 在领导面前吃不开的4种员工,中一条就别指望提拔了,说的真准
  8. openpyxl不能读取xls格式
  9. 程序虽小但功能强大!5个实用的微信小程序,每款都是生活好帮手
  10. HTML网页设计结课作业——基于HTML+CSS仿学校官网页面
  11. java游戏俄罗斯方块_Java俄罗斯方块小游戏
  12. windows10环境下iceworks(飞冰)安装
  13. HBuilder打开发生了错误。请参阅日志文件
  14. 微信“跳一跳”外挂制作历程
  15. 计算机评游戏图形低,5常见的PC游戏图形选项说明 | MOS86
  16. 2022红帽RHCSA考题解析
  17. ro.boot.verifiedbootstate 为 orange
  18. 模拟黑洞图像_全息图像模拟黑洞计划一一物理学家们的下一个宏伟目标
  19. 数字信号处理中的声学基础知识
  20. Tiktok、抖音及头条系为什么能引爆?产品力和算法力「AI产品/工程落地」

热门文章

  1. 将Source Insight里面着色代码拷贝到word里面的方法
  2. 线程属性 pthread_attr_t
  3. iOStextField/textView在输入时限制emoji表情的输入
  4. SpringBoot在自定义类中调用service层等Spring其他层
  5. Maven整合Spring3.0+Mybatis3.2+Struts2.3+查找坐标+jar包依赖(五)
  6. KMP 算法 学习 整理
  7. IEnumerable和IQueryable的区别
  8. 手机号、姓名、邮箱等合法性验证方法
  9. mysql root用户密码个性
  10. JNative用法注意事项