C#学习笔记

————Lesson1————
访问修饰符:
public
internal——只有同一namespace的才能访问
protected——只有继承于它的才能访问
private

————Lesson2————
1 结构和类的实例化
struct Person和class Person都可以用new Person()建立实例化对象

2 静态方法/静态成员
调用Person类的static方法getAge的方式为Person.getAge(),不用通过Person的一个实例化对象,static成员变量也是直接通过类而非实例化对象来调用

3 属性
Person类里的int属性Age最简单的创建方法:

public int Age{
	get;
	set;
}

person是Person的一个实例化对象,可以直接person.Age=10这样用,也可以直接Console.WriteLine(persin.Age)
也可以对属性Age的get、set方法做一些操作:

public int Age{
	get{
		return age+10;//age是Person的另一个成员变量
	}
	set{
		age=value-10;//value是用来赋值的值
	}
}

相比较成员变量而言,属性更加方便,因为直接写get、set,不用再写两个get和set方法

————Lesson3————
1 interface
只用写方法声明,不用写方法定义,方法的访问修饰符也不用写,实现它的类的对应的方法写就可以了。

2 抽象类
抽象类和接口一样,都不能被实例化,抽象类的作用是给其他类继承它。
抽象类里可以有成员变量、抽象或不抽象的方法,其中抽象方法写声明就可以

3 继承抽象类/接口的注意事项
可以继承多个类,但只能实现一个接口
某个类可以同时继承类与实现接口,并且必须写完整它继承的抽象类的抽象方法、接口的方法的定义

4 抽象类和接口的区别和联系

  • 类a实现了接口A,则a必须补全A的所有方法的定义;类b继承了抽象类B,则b也必须补全B的所有抽象方法的定义
  • 接口里有方法、属性、索引、事件,但不能有成员变量,抽象类里可以有类里有的所有东西
  • 接口里的方法不需要abstract修饰符且不能有定义,抽象类的方法可以抽象也可以不抽象,其中抽象方法只有声明没有定义
  • 某个类可以继承多个类,但只能实现一个接口

————Lesson4————
访问修饰符:
public——外部都能访问
internal——只有同一namespace的才能访问
protected——只有继承于它的才能访问
protected internal:只有继承于它的或同一个namespace的才能访问
private——外部都不能访问

————Lesson5————
1 sealed修饰符
应用于某个类时,sealed 修饰符可阻止其他类继承自该类。 在下面的示例中,类 B 继承自类 A,但没有类可以继承自类 B。

class A {}
sealed class B : A {}

2 子类new 和override方法的区别
如下,Dog是子类,Animal是父类,Dog里的Bite是override方法,BiteMan是new方法,Animal的Bite被override了,BiteMan就没有被override,Dog里的BiteMan是一个新的。
所以Animal dog3=new Dog();
dog3.Bite()调用Dog的
dog3.BiteMan()调用Animal的

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("=====第一个 dog=====");
            Dog dog = new Dog();//调用顺序:先调用Animal的默认构造函数,再调用Dog的默认构造函数
            dog.Age = 10;
            dog.Bite();//输出dog bite
            dog.GetAge();//输出Animal age: 10
            dog.BiteMan();//输出dog bite man

            Console.WriteLine("=====第二个 dog=====");
            Dog dog2 = new Dog(10);//调用顺序:1.如果Dog的具体构造函数是a那样写——先调用Animal的默认构造函数,再调用Dog的具体构造函数;
                                     //2.如果Dog的具体构造函数是b那样写——先调用Animal的具体构造函数,再调用Dog的具体构造函数
                                     //3.如果Dog的具体构造函数是c那样写——先调用Animal的默认构造函数,再调用Dog的默认构造函数,再调用Dog的具体构造函数

            Console.WriteLine("=====第三个 dog=====");
            Animal dog3 = new Dog();//调用顺序:先调用Animal的默认构造函数,再调用Dog的默认构造函数
            dog3.Bite();//输出dog bite
            dog3.BiteMan();//输出Animal bite man,原因是Animal的BiteMan就没有被override,Dog里的BiteMan是一个新的
            ((Dog)dog3).BiteMan();//强制类型转换了,输出dog bite man

          
        }
    }

    class Animal
    {
        public int Age
        {
            get;
            set;
        }
        public Animal()
        {
            Console.WriteLine("Animal constructor");
        }
        public Animal(int age)
        {
            Console.WriteLine("Old animal");
            this.Age = age;
        }
        public virtual void Bite() { Console.WriteLine("Animal bite"); }
        public virtual void GetAge() { Console.WriteLine("Animal age: "+Age); }
        public void BiteMan() { Console.WriteLine("Animal bite man"); }
    }

    sealed class Dog : Animal
    {
        public Dog()
        {
            Console.WriteLine("Dog constructor");
        }
        //a.
        //public Dog(int age)
        //{
        //    Console.WriteLine("Old dog");
        //    this.Age = age;
        //}
        //b.
        //public Dog(int age):base(age)
        //{
        //    Console.WriteLine("Old dog");
        //    this.Age = age;
        //}
        //c.
        public Dog(int age) : this()
        {
            Console.WriteLine("Old dog");
            this.Age = age;
        }
        public override void Bite()
        {
            Console.WriteLine("dog bite");
        }
        public new void BiteMan() { Console.WriteLine("dog bite man"); }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值