zoukankan      html  css  js  c++  java
  • C#中的类、方法和属性

         这节讲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块设置为私有的,或者也可以不写,自我感觉自动属性就是为了少写代码,没啥特殊的。

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

  • 相关阅读:
    遇到的函数知识
    网络编程
    python中的并发编程
    Django contenttypes组件
    同源策略定义及跨域解决方案
    Django Rest framework
    RESTful API
    python 给对象添加方法
    python 装饰器(复杂一点的)
    android动态替换Fragment向下传递数据
  • 原文地址:https://www.cnblogs.com/charlesmvp/p/13798887.html
Copyright © 2011-2022 走看看