C#
文章平均质量分 62
吴俊荣
我是一个非常非常懒的人
展开
-
C#——元组类型
C#——元组类型元组功能在 C# 7.0 及更高版本中可用,它提供了简洁的语法,用于将多个数据元素分组成一个轻型数据结构。 下面的示例演示了如何声明元组变量、对它进行初始化并访问其数据成员:、(double, int) t1 = (4.5, 3);Console.WriteLine($"Tuple with elements {t1.Item1} and {t1.Item2}.");// Output:// Tuple with elements 4.5 and 3.(double Sum,原创 2021-01-12 18:04:13 · 5841 阅读 · 0 评论 -
C#——结构类型
C#——结构类型结构类型(“structure type”或“struct type”)是一种可封装数据和相关功能的值类型 。 使用 struct 关键字定义结构类型:public struct Coords{ public Coords(double x, double y) { X = x; Y = y; } public double X { get; } public double Y { get; } pub原创 2021-01-12 17:43:59 · 1344 阅读 · 0 评论 -
C#——枚举类型
C#——枚举类型枚举类型 是由基础整型数值类型的一组命名常量定义的值类型。 若要定义枚举类型,请使用 enum 关键字并指定枚举成员 的名称:enum Season{ Spring, Summer, Autumn, Winter}默认情况下,枚举成员的关联常数值为类型 int;它们从零开始,并按定义文本顺序递增 1。 可以显式指定任何其他整数数值类型作为枚举类型的基础类型。 还可以显式指定关联的常数值,如下面的示例所示:enum ErrorCode : usho原创 2021-01-12 17:30:45 · 2052 阅读 · 0 评论 -
C#——关键字:volatile
C#——关键字:volatilevolatile 关键字指示一个字段可以由多个同时执行的线程修改。 出于性能原因,编译器,运行时系统甚至硬件都可能重新排列对存储器位置的读取和写入。 声明了 volatile 的字段不进行这些优化。 添加 volatile 修饰符可确保所有线程观察易失性写入操作(由任何其他线程执行)时的观察顺序与写入操作的执行顺序一致。 不确保从所有执行线程整体来看时所有易失性写入操作均按执行顺序排序。volatile 关键字可应用于以下类型的字段:引用类型。指针类型(在不安全的上原创 2021-01-12 16:15:52 · 3092 阅读 · 0 评论 -
C#——关键字:virtual
C#——关键字:virtualvirtual 关键字用于修改方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。 例如,此方法可被任何继承它的类替代:public virtual double Area(){ return x * y;}虚拟成员的实现可由派生类中的替代成员更改。 有关如何使用 virtual 关键字的详细信息.备注调用虚拟方法时,将为替代的成员检查该对象的运行时类型。 将调用大部分派生类中的该替代成员,如果没有派生类替代该成员,则它可能是原始成员。默认情况原创 2021-01-12 16:11:50 · 426 阅读 · 0 评论 -
C#——关键字:unsafe
C#——关键字:unsafeunsafe 关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。可在类型或成员的声明中使用 unsafe 修饰符。 因此,类型或成员的整个正文范围均被视为不安全上下文。 以下面使用 unsafe 修饰符声明的方法为例:unsafe static void FastCopy(byte[] src, byte[] dst, int count){ // Unsafe context: can use pointers here.}不安全上下文的范围从原创 2021-01-12 16:08:30 · 1262 阅读 · 0 评论 -
C#——关键字:static
C#——关键字:static本页介绍 static 修饰符关键字。 static 关键字也是 using static 指令的一部分。使用 static 修饰符可声明属于类型本身而不是属于特定对象的静态成员。 static 修饰符可用于声明 static 类。 在类、接口和结构中,可以将 static 修饰符添加到字段、方法、属性、运算符、事件和构造函数。 static 修饰符不能用于索引器或终结器。从 C# 8.0 开始,可以将 static 修饰符添加到本地函数。 静态本地函数无法捕获局部变量或实原创 2021-01-11 18:29:09 · 288 阅读 · 0 评论 -
C#——关键字:sealed
C#——关键字:sealed应用于某个类时,sealed 修饰符可阻止其他类继承自该类。 在下面的示例中,类 B 继承自类 A,但没有类可以继承自类 B。class A {}sealed class B : A {}还可以对替代基类中的虚方法或属性的方法或属性使用 sealed 修饰符。 这使你可以允许类派生自你的类并防止它们替代特定虚方法或属性。示例在下面的示例中,Z 继承自 Y,但 Z 无法替代在 X 中声明并在 Y 中密封的虚函数 F。class X{ protected v原创 2021-01-11 18:23:18 · 306 阅读 · 0 评论 -
C#——关键字:readonly
C#——关键字:readonlyreadonly 关键字是一个可在四个上下文中使用的修饰符:在字段声明中,readonly 指示只能在声明期间或在同一个类的构造函数中向字段赋值。 可以在字段声明和构造函数中多次分配和重新分配只读字段。构造函数退出后,不能分配 readonly 字段。 此规则对于值类型和引用类型具有不同的含义:1.由于值类型直接包含数据,因此属于 readonly 值类型的字段不可变。2.由于引用类型包含对其数据的引用,因此属于 readonly 引用类型的字段必须始终引用同一原创 2021-01-11 16:30:02 · 11342 阅读 · 0 评论 -
C#——关键字:extern
C#——关键字:externextern 修饰符用于声明在外部实现的方法。 extern 修饰符的常见用法是在使用 Interop 服务调入非托管代码时与 DllImport 特性一起使用。 在这种情况下,还必须将方法声明为 static,如下面的示例所示:[DllImport("avifil32.dll")]private static extern void AVIFileInit();extern 关键字还可以定义外部程序集别名,使得可以从单个程序集中引用同一组件的不同版本。将 abstr原创 2021-01-11 16:09:08 · 5340 阅读 · 0 评论 -
C#——关键字:override
C#——override扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现需要 override 修饰符。在以下示例中,Square 类必须提供 GetArea 的重写实现,因为 GetArea 继承自抽象 Shape 类:abstract class Shape{ public abstract int GetArea();}class Square : Shape{ int side; public Square(int n) => side = n原创 2021-01-11 14:49:30 · 906 阅读 · 1 评论 -
C#——Lambda 表达式
C#——Lambda 表达式“Lambda 表达式”是采用以下任意一种形式的表达式:表达式 lambda,表达式为其主体:(input-parameters) => expression语句 lambda,语句块作为其主体:(input-parameters) => { <sequence-of-statements> }使用 lambda 声明运算符=> 从其主体中分离 lambda 参数列表。 若要创建 Lambda 表达式,需要在 Lambda 运原创 2021-01-11 11:51:58 · 5918 阅读 · 0 评论 -
C#——声明、实例化和使用委托
C#——如何声明、实例化和使用委托在 C# 1.0 和更高版本中,可以如下面的示例所示声明委托。// Declare a delegate.delegate void Del(string str);// Declare a method with the same signature as the delegate.static void Notify(string name){ Console.WriteLine($"Notification received for: {name原创 2021-01-07 11:58:30 · 916 阅读 · 0 评论 -
C#——如何合并委托(多播委托)
C#——如何合并委托(多播委托)此示例演示如何创建多播委托。 委托对象的一个有用属性在于可通过使用 + 运算符将多个对象分配到一个委托实例。 多播委托包含已分配委托列表。 此多播委托被调用时会依次调用列表中的委托。 仅可合并类型相同的委托。-运算符可用于从多播委托中删除组件委托。示例using System;// Define a custom delegate that has a string parameter and returns void.delegate void CustomD原创 2021-01-07 11:50:31 · 293 阅读 · 0 评论 -
C#——带有命名方法的委托与匿名方法
C#——带有命名方法的委托与匿名方法委托可以与命名方法相关联。 使用命名方法实例化委托时,该方法作为参数传递,例如:// Declare a delegate.delegate void Del(int x);// Define a named method.void DoWork(int k) { /* ... */ }// Instantiate the delegate using the method as a parameter.Del d = obj.DoWork;这称为使原创 2021-01-07 11:47:14 · 247 阅读 · 0 评论 -
C#——委托
C#——委托委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。 你可以通过委托实例调用方法。委托用于将方法作为参数传递给其他方法。 事件处理程序就是通过委托调用的方法。 你可以创建一个自定义方法,当发生特定事件时,某个类(如 Windows 控件)就可以调用你的方法。 下面的示例演示了一个委托声明:public delegate int PerformCalculation(int x, int y);可将任原创 2021-01-07 11:43:37 · 156 阅读 · 0 评论 -
C#——如何实现自定义事件访问器
C#——如何实现自定义事件访问器事件是一种特殊的多播委托,只能从声明它的类中进行调用。 客户端代码通过提供对应在引发事件时调用的方法的引用来订阅事件。 这些方法通过事件访问器添加到委托的调用列表中,事件访问器类似于属性访问器,不同之处在于事件访问器命名为 add 和 remove。 在大多数情况下,无需提供自定义事件访问器。 如果代码中没有提供自定义事件访问器,编译器将自动添加它们。 但在某些情况下,可能需要提供自定义行为。示例下面的示例演示如何实现自定义的 add 和 remove 事件访问器。 虽原创 2021-01-07 10:47:40 · 390 阅读 · 0 评论 -
C#——如何实现接口事件
C#——如何实现接口事件在类中实现接口事件在类中声明事件,然后在相应区域中调用它。namespace ImplementInterfaceEvents { public interface IDrawingObject { event EventHandler ShapeChanged; } public class MyEventArgs : EventArgs { // class members原创 2021-01-07 10:45:42 · 882 阅读 · 0 评论 -
C#——如何在派生类中引发基类事件
C#——如何在派生类中引发基类事件下面的简单示例演示用于在基类中声明事件,以便也可以从派生类引发它们的标准方法。 此模式广泛用于 .NET 类库中的 Windows 窗体类。创建可以用作其他类的基类的类时,应考虑到以下事实:事件是特殊类型的委托,只能从声明它们的类中进行调用。 派生类不能直接调用在基类中声明的事件。 虽然有时可能需要只能由基类引发的事件,不过在大多数情况下,应使派生类可以调用基类事件。 为此,可以在包装事件的基类中创建受保护的调用方法。 通过调用或重写此调用方法,派生类可以间接调用事件。原创 2021-01-06 18:14:27 · 510 阅读 · 0 评论 -
C#——事件
事件类 或对象可以通过事件向其他类或对象通知发生的相关事情。 发送(或引发)事件的类称为“发布者”,接收(或处理)事件的类称为“订阅者”。在典型的 C# Windows 窗体或 Web 应用程序中,可订阅由按钮和列表框等控件引发的事件。 可以使用 Visual C# 集成开发环境 (IDE) 来浏览控件发布的事件,并选择想要处理的事件。 借助 IDE,可轻松自动添加空白事件处理程序方法以及要订阅该事件的代码事件概述事件具有以下属性:1.发行者确定何时引发事件;订户确定对事件作出何种响应。2.一个原创 2021-01-06 18:08:27 · 304 阅读 · 0 评论 -
C#——关键字:event
C#——关键字:eventevent 关键字用于声明发布服务器类中的事件。示例下面的示例演示如何声明和引发使用 EventHandler 作为基础委托类型的事件。public class SampleEventArgs{ public SampleEventArgs(string text) { Text = text; } public string Text { get; } // readonly}public class Publisher{ // Decl原创 2021-01-06 16:55:34 · 736 阅读 · 1 评论 -
C#——关键字:const
C#——关键字:const使用 const 关键字来声明某个常量字段或常量局部变量。 常量字段和常量局部变量不是变量并且不能修改。 常量可以为数字、布尔值、字符串或 null 引用。 不要创建常量来表示你需要随时更改的信息。 例如,不要使用常量字段来存储服务的价格、产品版本号或公司的品牌名称。 这些值会随着时间发生变化;因为编译器会传播常量,所以必须重新编译通过库编译的其他代码以查看更改。const int X = 0;public const double GravitationalConstant原创 2021-01-06 11:56:34 · 509 阅读 · 1 评论 -
C#——关键字:async
C#——关键字:asyncasync使用 async 修饰符可将方法、lambda 表达式或匿名方法指定为异步。 如果对方法或表达式使用此修饰符,则其称为异步方法 。 如下示例定义了一个名为 ExampleMethodAsync 的异步方法:public async Task<int> ExampleMethodAsync(){ //...}如果不熟悉异步编程,或者不了解异步方法如何在不阻止调用方线程的情况下使用 await 运算符执行可能需要长时间运行的工作,请参阅使用原创 2021-01-06 11:51:25 · 1589 阅读 · 0 评论 -
C#——关键字:abstract
C#——关键字:abstractabstractabstract 修饰符指示被修改内容的实现已丢失或不完整。 abstract 修饰符可用于类、方法、属性、索引和事件。 在类声明中使用 abstract 修饰符来指示某个类仅用作其他类的基类,而不用于自行进行实例化。 标记为抽象的成员必须由派生自抽象类的非抽象类来实现。示例在此示例中,类 Square 必须提供 GetArea 的实现,因为它派生自 Shape:abstract class Shape{ public abstract i原创 2021-01-06 11:34:40 · 900 阅读 · 1 评论 -
C#——委托中的变体
C#——委托中的变体.NET Framework 3.5 引入了变体支持,用于在 C# 中匹配所有委托的方法签名和委托类型。 这表明不仅可以将具有匹配签名的方法分配给委托,还可以将返回派生程度较大的派生类型的方法分配给委托(协变),或者如果方法所接受参数的派生类型所具有的派生程度小于委托类型指定的程度(逆变),也可将其分配给委托。 这包括泛型委托和非泛型委托。例如,思考以下代码,该代码具有两个类和两个委托:泛型和非泛型。public class First { } public class Sec原创 2021-01-06 11:23:21 · 176 阅读 · 0 评论 -
C#——泛型接口中的变体
C#——泛型接口中的变体NET Framework 4 引入了对多个现有泛型接口的变体支持。 变体支持允许实现这些接口的类进行隐式转换。自 .NET Framework 4 起,以下接口为变体:IEnumerable(T 是协变)IEnumerator(T 是协变)IQueryable(T 是协变)IGrouping<TKey,TElement>(TKey 和 TElement 都是协变)IComparer(T 是逆变)IEqualityComparer(T 是逆变)IComp原创 2021-01-06 10:29:28 · 219 阅读 · 0 评论 -
C#——协变和逆变
C#——协变和逆变在 C# 中,协变和逆变能够实现数组类型、委托类型和泛型类型参数的隐式引用转换。 协变保留分配兼容性,逆变则与之相反。以下代码演示分配兼容性、协变和逆变之间的差异。// Assignment compatibility.string str = "test"; // An object of a more derived type is assigned to an object of a less derived type.object obj = str; //原创 2021-01-06 10:09:19 · 550 阅读 · 0 评论 -
C#——泛型类型约束关键字new和where
C#——泛型类型约束关键字new和wherenew 约束new 约束指定泛型类声明中的类型实参必须有公共的无参数构造函数。 若要使用 new 约束,则该类型不能为抽象类型。当泛型类创建类型的新实例时,请将 new 约束应用于类型参数,如下面的示例所示:class ItemFactory<T> where T : new(){ public T GetNewItem() { return new T(); }}当与其他约束一起使用时,new(原创 2021-01-05 16:36:30 · 1453 阅读 · 0 评论 -
C#——ref
C#——ref关键字ref 关键字指示按引用传递的值。 它用在四种不同的上下文中:1.在方法签名和方法调用中,按引用将参数传递给方法。2.在方法签名中,按引用将值返回给调用方。3.在成员正文中,指示引用返回值是否作为调用方欲修改的引用被存储在本地,或在一般情况下,局部变量按引用访问另一个值。4.在 struct 声明中声明 ref struct 或 readonly ref struct。按引用传递参数在方法的参数列表中使用 ref 关键字时,它指示参数按引用传递,而非按值传递。 ref 关原创 2021-01-05 10:57:12 · 29194 阅读 · 0 评论 -
C#——out 参数修饰符
C#——out 参数修饰符out 关键字通过引用传递参数。 它让形参成为实参的别名,这必须是变量。 换而言之,对形参执行的任何操作都是对实参执行的。 它与 ref 关键字相似,只不过 ref 要求在传递之前初始化变量。 它也类似于 in 关键字,只不过 in 不允许通过调用方法来修改参数值。 若要使用 out 参数,方法定义和调用方法均必须显式使用 out 关键字。 例如:int initializeInMethod;OutArgExample(out initializeInMethod);Con原创 2021-01-05 10:30:04 · 1096 阅读 · 1 评论 -
C#——in 参数修饰符
C#——in 参数修饰符in 关键字通过引用传递参数。 它让形参成为实参的别名,这必须是变量。 换而言之,对形参执行的任何操作都是对实参执行的。 它类似于 ref 或 out 关键字,不同之处在于 in 参数无法通过调用的方法进行修改。 out 参数必须由调用的方法进行修改,这些修改在调用上下文中是可观察的,而 ref 参数是可以修改的。int readonlyArgument = 44;InArgExample(readonlyArgument);Console.WriteLine(readonl原创 2021-01-05 09:27:54 · 4372 阅读 · 1 评论 -
C#——引用类型
C#——引用类型定义为 类、委托、数组或 接口的类型是 引用类型。 在运行时,当声明引用类型的变量时,该变量会一直包含值 null,直至使用 new 运算符显式创建对象,或者为该变量分配已经在其他位置使用 new 创建的对象,如下所示:MyClass mc = new MyClass();MyClass mc2 = mc;接口必须与实现它的类对象一起初始化。 如果 MyClass 实现 IMyInterface,则按以下示例所示创建 IMyInterface 的实例:IMyInterface i原创 2021-01-04 17:50:18 · 3679 阅读 · 0 评论 -
C#——值类型
C#——值类型值类型派生自System.ValueType(派生自 System.Object)。 派生自 System.ValueType 的类型在 CLR 中具有特殊行为。 值类型变量直接包含它们的值,这意味着在声明变量的任何上下文中内联分配内存。 对于值类型变量,没有单独的堆分配或垃圾回收开销。值类型分为两类:结构和枚举。内置的数值类型是结构,它们具有可访问的字段和方法:// constant field on type byte.byte b = byte.MaxValue;但可将这些原创 2021-01-04 17:46:55 · 1180 阅读 · 0 评论 -
C#——编写安全有效的C#代码
C#——编写安全有效的C#代码借助 C# 中的新增功能可编写性能更好的可验证安全代码。 若仔细地应用这些技术,则需要不安全代码的方案更少。 利用这些功能,可更轻易地将对值类型的引用用作方法参数和方法返回。 安全完成后,这些技术可以最大程度地减少值类型的复制操作。 通过使用值类型,可以使分配和垃圾回收过程的数量降至最低。本文中的很多示例代码都使用了 C# 7.2 中增加的功能。 要使用这些功能,必须将项目配置为使用 C# 7.2 或更高版本。 有关设置语言版本的详细信息,请参阅配置语言版本。本文重点介绍转载 2020-12-31 18:00:26 · 319 阅读 · 0 评论