Leason12138

导航

C# 高级教程

JS.InvokeVoidAsync 可以异步调用挂载到Window上的方法,而不读取返回的值
JS.InvokeAsync 可以异步调用挂载到Window上的方法,并读取返回的值通常JS.InvokeAsync

C# 高级教程

一、C# 特性(Attribute)

特性简介:
特性是一种为程序元素(如类、方法、属性等)附加额外信息的机制。这些额外信息可以被编译器、运行时或者其他工具读取和使用,以影响程序的行为或提供元数据。
特性的用途:
提供元数据:例如,Obsolete特性可以标记一个方法为过时的,提醒开发者不再使用该方法。
配置框架:许多框架使用特性来配置组件的行为。
代码生成:一些工具可以根据特性生成额外的代码。
示例代码:

using System;

class Program
{
    [Obsolete("This method is deprecated. Use NewMethod instead.")]
    static void OldMethod()
    {
        Console.WriteLine("This is the old method.");
    }

    static void NewMethod()
    {
        Console.WriteLine("This is the new method.");
    }

    static void Main()
    {
        OldMethod();
        NewMethod();
    }
}

在上面的代码中,Obsolete特性被应用于OldMethod,当调用这个方法时,编译器会发出警告,提示该方法已过时。

二、C# 反射(Reflection)

反射简介:
反射允许在运行时检查和操作程序的类型信息。通过反射,可以获取程序集中的类型、方法、属性、字段等信息,并可以动态地调用方法、创建对象等。
反射的用途:
插件系统:可以在运行时加载插件,而不需要在编译时知道插件的具体类型。
依赖注入容器:可以自动解析对象之间的依赖关系。
动态代理:可以在运行时创建代理对象,拦截方法调用。
示例代码:

using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        Type type = typeof(MyClass);
        Console.WriteLine($"Type name: {type.Name}");

        MethodInfo method = type.GetMethod("MyMethod");
        if (method!= null)
        {
            method.Invoke(null, null);
        }

        PropertyInfo property = type.GetProperty("MyProperty");
        if (property!= null)
        {
            Console.WriteLine($"Property value: {property.GetValue(null)}");
        }
    }
}

class MyClass
{
    public static void MyMethod()
    {
        Console.WriteLine("This is a method.");
    }

    public static int MyProperty
    {
        get { return 42; }
    }
}

在上面的代码中,通过反射获取了MyClass的类型信息,并调用了其中的方法和获取了属性的值。

三、C# 属性(Property)

属性简介:
属性是一种用于访问对象状态的机制,它看起来像字段,但实际上是由get和set访问器组成的。属性可以提供对私有字段的受控访问,进行数据验证、计算等操作。
属性的用途:
封装数据:隐藏对象的内部状态,只通过属性暴露必要的信息。
数据验证:在设置属性值时进行验证,确保数据的有效性。
计算属性:根据其他属性或状态计算出的值。
示例代码:

using System;

class Program
{
    static void Main()
    {
        Person person = new Person();
        person.Name = "Alice";
        person.Age = 30;

        Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
    }
}

class Person
{
    private string name;
    private int age;

    public string Name
    {
        get { return name; }
        set
        {
            if (string.IsNullOrEmpty(value))
            {
                throw new ArgumentException("Name cannot be empty.");
            }
            name = value;
        }
    }

    public int Age
    {
        get { return age; }
        set
        {
            if (value < 0 || value > 120)
            {
                throw new ArgumentException("Age must be between 0 and 120.");
            }
            age = value;
        }
    }
}

在上面的代码中,Person类的Name和Age属性都进行了数据验证,确保设置的值是有效的。

四、C# 索引器(Indexer)

索引器简介:
索引器允许对象像数组一样通过索引进行访问。可以为类或结构定义索引器,使得可以使用类似于数组的语法来访问对象的内部集合或数据结构。
索引器的用途:
提供类似数组的访问方式:对于包含多个元素的对象,可以使用索引器来方便地访问其中的元素。
自定义索引逻辑:可以根据不同的需求定义索引的行为,例如多维索引、动态索引等。
示例代码:

using System;

class Program
{
    static void Main()
    {
        MyCollection collection = new MyCollection();
        collection[0] = "Item 1";
        collection[1] = "Item 2";

        Console.WriteLine(collection[0]);
        Console.WriteLine(collection[1]);
    }
}

class MyCollection
{
    private string[] items = new string[10];

    public string this[int index]
    {
        get { return items[index]; }
        set { items[index] = value; }
    }
}

在上面的代码中,MyCollection类定义了一个索引器,使得可以像访问数组一样访问该类的实例。

五、C# 委托(Delegate)

委托简介:
委托是一种类型安全的函数指针,可以指向一个或多个方法。委托定义了方法的签名,通过委托可以将方法作为参数传递,实现回调机制、事件处理等。
委托的用途:
回调机制:在异步编程中,可以使用委托来指定回调方法。
事件处理:委托是 C# 中实现事件的基础。
方法组合:可以将多个方法组合成一个委托,依次调用这些方法。
示例代码:

using System;

class Program
{
    static void Main()
    {
        MyDelegate del = Method1;
        del += Method2;

        del();
    }

    static void Method1()
    {
        Console.WriteLine("Method 1");
    }

    static void Method2()
    {
        Console.WriteLine("Method 2");
    }
}

delegate void MyDelegate();

在上面的代码中,定义了一个委托MyDelegate,并将两个方法Method1和Method2组合到这个委托中,然后调用委托,依次执行这两个方法。

六、C# 事件(Event)

事件简介:
事件是一种基于委托的机制,用于在对象状态发生变化时通知其他对象。事件使得对象之间的交互更加松散耦合,提高了代码的可维护性和可扩展性。
事件的用途:
响应对象状态变化:当一个对象的状态发生变化时,可以触发事件,通知其他对象进行相应的处理。
实现观察者模式:事件是实现观察者模式的一种方式,被观察的对象发生变化时,通知观察者进行更新。
示例代码:

using System;

class Program
{
    static void Main()
    {
        MyEventSource source = new MyEventSource();
        source.MyEvent += MyEventHandler;

        source.DoSomething();
    }

    static void MyEventHandler(object sender, EventArgs e)
    {
        Console.WriteLine("Event received.");
    }
}

class MyEventSource
{
    public event EventHandler MyEvent;

    public void DoSomething()
    {
        if (MyEvent!= null)
        {
            MyEvent(this, EventArgs.Empty);
        }
    }
}

在上面的代码中,MyEventSource类定义了一个事件MyEvent,当调用DoSomething方法时,触发这个事件。在Main方法中,订阅了这个事件,并在事件处理方法中输出一条消息。

七、C# 集合(Collection)

集合简介:
C# 提供了一系列的集合类,用于存储和操作一组对象。常见的集合类有List、Dictionary、Queue、Stack等。集合类提供了各种方法来添加、删除、遍历和搜索元素,使得对一组对象的管理更加方便。
集合的用途:
存储一组对象:根据不同的需求选择合适的集合类来存储对象。
操作对象集合:可以对集合中的对象进行添加、删除、遍历、搜索等操作。
提高代码效率:集合类通常经过优化,提供高效的操作方法。
示例代码:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<string> list = new List<string>();
        list.Add("Item 1");
        list.Add("Item 2");

        foreach (string item in list)
        {
            Console.WriteLine(item);
        }

        Dictionary<string, int> dictionary = new Dictionary<string, int>();
        dictionary["key1"] = 10;
        dictionary["key2"] = 20;

        Console.WriteLine(dictionary["key1"]);
    }
}

在上面的代码中,分别使用了List和Dictionary集合类来存储和操作对象。

八、C# 泛型(Generic)

泛型简介:
泛型允许在定义类、方法和委托时不指定具体的类型,而是在使用时指定类型参数。泛型提高了代码的可重用性和类型安全性,避免了装箱和拆箱操作,提高了性能。
泛型的用途:
通用数据结构:可以定义通用的集合类、算法等,适用于不同的类型。
类型安全:在编译时确保类型的正确性,避免类型转换错误。
性能优化:避免装箱和拆箱操作,提高性能。
示例代码:

using System;

class Program
{
    static void Main()
    {
        MyGeneric<int> genericInt = new MyGeneric<int>();
        genericInt.Value = 42;
        Console.WriteLine(genericInt.Value);

        MyGeneric<string> genericString = new MyGeneric<string>();
        genericString.Value = "Hello";
        Console.WriteLine(genericString.Value);
    }
}

class MyGeneric<T>
{
    public T Value { get; set; }
}

在上面的代码中,定义了一个泛型类MyGeneric,可以存储不同类型的值。在Main方法中,分别创建了存储整数和字符串的实例。

九、C# 匿名方法

匿名方法简介:
匿名方法是一种没有名称的方法,可以在需要委托的地方直接定义方法体。匿名方法使得代码更加简洁,特别是在处理事件或使用委托作为参数时。
匿名方法的用途:
简化代码:避免定义单独的方法,直接在需要的地方定义方法体。
访问外部变量:匿名方法可以访问外部变量,提供了一种方便的方式来定义局部的回调方法。
示例代码:

using System;

class Program
{
    static void Main()
    {
        MyDelegate del = delegate()
        {
            Console.WriteLine("Anonymous method.");
        };

        del();
    }
}

delegate void MyDelegate();

在上面的代码中,使用匿名方法定义了一个委托,并调用这个委托。

十、C# 不安全代码

不安全代码简介:
不安全代码允许直接访问内存地址和进行指针操作。使用不安全代码需要在代码中添加unsafe关键字,并在项目设置中启用不安全代码。
不安全代码的用途:
与底层系统交互:在某些情况下,需要直接访问内存地址来与底层系统进行交互。
提高性能:在某些情况下,指针操作可以提高性能。
示例代码:

using System;

class Program
{
    static unsafe void Main()
    {
        int* ptr;
        int value = 42;
        ptr = &value;

        Console.WriteLine(*ptr);
    }
}

在上面的代码中,使用不安全代码定义了一个指针,并通过指针访问了一个整数的值。

十一、C# 多线程

多线程简介:
C# 支持多线程编程,可以创建多个线程同时执行不同的任务。多线程可以提高程序的响应性和性能,特别是在处理耗时的操作时。
多线程的用途:
提高响应性:在处理耗时的操作时,不会阻塞主线程,提高程序的响应性。
提高性能:可以利用多核处理器的优势,同时执行多个任务,提高性能。
示例代码:

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        Thread thread = new Thread(MyMethod);
        thread.Start();

        Console.WriteLine("Main thread.");
    }

    static void MyMethod()
    {
        Console.WriteLine("Secondary thread.");
    }
}

在上面的代码中,创建了一个新的线程来执行MyMethod方法,同时主线程继续执行。

posted on 2024-09-04 17:46  Leason12138  阅读(47)  评论(0编辑  收藏  举报