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) 编辑 收藏 举报