C#基础

int[,] a = new int[3,4] {0, 1, 2, 3,} ,  {4, 5, 6, 7} , {8, 9, 10, 11} };

即声明一个名称为a的三行四列的二维数组

多态

在C#中多态可分为“静态多态性”与“动态多态性”

静态多态性可以通过以下方式实现:

  1. 方法重载:(overload)在同一个类中,方法名相同,参数不同;

  2. 方法重写:在子类中重写父类中的方法,每一个所继承的子类中有不同重写的实现;

  3. 接口实现:在接口中编写相同方法的名称,每一个所继承的子类中有不同的实现;

动态多态性:

通过抽象类实现多态

覆写(new),重写(override)

覆写(new)

子类在继承父类时,可以通过 "new" 关键字对父类中成员进行覆写(即重新定义父类成员)。

重写(override)

子类在继承抽象类(abstract),或者包含虚方法(virtual) 的父类时,可以通过 override 关键字对父类中的成员进行重写。

abstract抽象类

通过 "abstract" 关键字声明一个抽象类或抽象方法,抽象方法只能声明在抽象类中。

在抽象类中,既可以包含抽象方法,也可以包含非抽象的方法。抽象方法不能包含方法体。

在子类继承抽象类(父类)时,要想调用父类中的抽象方法,必须通过override重写来实现。

子类在继承抽象类时,必须全部实现父类中成员。

interface接口

接口中不可以有字段,可以有属性,方法(不能包含方法体,不能有访问修饰符),事件,索引器。

接口主要使用场景:

  1. 定义一组类的行为,指定一个类中必须要继承哪几个方法。

  2. 实现多继承,一个类可以继承多个接口。

集合

在C#中通过集合可以存储和操作数据,集合包括(List,Hashset,Hashtable,Dictionary,Queue,Stack)

List 使用动态数组(可变长度)添加集合类,在内存中连续存储元素,支持随机访问和元素的添加,删除,排序等操作。

Hashset 特点:用于存储独特的对象集合,每个对象只能出现一次,内部使用哈希表实现。

优势:添加与查找元素的速度非常快,支持泛型和迭代器。

用法:Add() 用于添加元素,Remove() 用于删除元素,Contains 用于判断集合中是否包含某个元素。

HashSet<string> mySet = new HashSet<string>();
mySet.Add("apple");
mySet.Add("banana");
mySet.Add("orange");

if (mySet.Contains("apple"))
{
    Console.WriteLine("Found apple.");
}

Hashtable 特点:通过键值对存储元素,其中键值对可以为任意类型,但是键是唯一的。

用法:Add() 用于添加元素,Remove() 用于删除元素,Contains 用于判断集合中是否包含某个元素。

Hashtable myTable = new Hashtable();
myTable.Add("apple", "red");
myTable.Add("banana", "yellow");
myTable.Add("orange", "orange");

if (myTable.ContainsKey("apple"))
{
    Console.WriteLine("Apple is {0}.", myTable["apple"]);
}

Dictionary 特点:通过键值对存储元素,Dictionary比Hashtable更加类型安全,也更容易使用。Dictionary仅支持特定的键类型,并且使用了更好的算法来处理哈希码的计算和存 储。 Hashtable允许任何类型的键并且它的哈希算法是相当简单的,这可能导致冲突更多,影响性能。当需要存储键值对时,如果键类型比较特定,建议使用 Dictionary,而当键类型较为复杂时,则更适合使用Hashtable。

Dictionary<string, int> score = new Dictionary<string, int>();
score.Add("Tom", 90);
score.Add("Jerry", 80);
score.Add("Tony", 70);

int jerryScore = score["Jerry"];
Console.WriteLine("Jerry's score is: " + jerryScore);

if (score.ContainsKey("Tom"))
{
    int tomScore = score["Tom"];
    Console.WriteLine("Tom's score is: " + tomScore);
}

foreach (KeyValuePair<string, int> kvp in score)
{
    Console.WriteLine(kvp.Key + ": " + kvp.Value);
}

**Queue 队列:**先进先出

**Stack 栈:**先进后出

Stack<string> stack = new Stack<string>();
stack.Push("Tom");
stack.Push("Jerry");
stack.Push("Tony");

while (stack.Count > 0)
{
    string name = stack.Pop();
    Console.WriteLine("Processing " + name);
}

泛型

泛型方法,泛型接口,泛型类

class Stack<T>
{
    private List<T> items = new List<T>();

    public void Push(T item)
    {
        items.Add(item);
    }

    public T Pop()
    {
        if (items.Count == 0)
        {
            throw new InvalidOperationException("Stack is empty");
        }

        int index = items.Count - 1;
        T item = items[index];
        items.RemoveAt(index);
        return item;
    }
}

线程

posted on 2023-07-06 15:28  Cirrocumuli  阅读(24)  评论(0)    收藏  举报

导航