C#关键字

volatile

当field_declaration包含 volatile 修饰符时,该声明引入的字段是可变字段。
对于非易失性字段,重新排序指令的优化方法可能导致意外且不可预知的结果,这会导致多线程程序在没有同步的情况下(如lock_statement提供的字段)访问字段(lock 语句)。 这些优化可以由编译器、运行时系统或硬件执行。 对于可变字段,此类重新排序优化将受到限制:
读取可变字段称为易失性读取。 可变读取具有 “获取语义”;也就是说,保证在对指令序列中出现其后的内存进行引用之前发生。
可变字段的写入称为可变写入。 可变写入具有 “发布语义”;也就是说,保证在指令序列中写入指令之前的任何内存引用后发生。
这些限制确保所有线程观察易失性写入操作(由任何其他线程执行)时的观察顺序与写入操作的执行顺序一致。 一致性实现不需要提供可变写入的单个总体顺序,如所有执行线程中所示。 可变字段的类型必须是以下类型之一:
一个reference_type。
类型 byte、sbyte、short、ushort、int、uint、char、float、bool、System.IntPtr或 System.UIntPtr。
具有 byte、sbyte、short、ushort、int或 uint的枚举基类型的enum_type 。
示例
C#
using System;
using System.Threading;
class Test
{
public static int result;
public static volatile bool finished;
static void Thread2() {
result = 143;
finished = true;
}
static void Main() {
finished = false;
// Run Thread2() in a new thread
new Thread(new ThreadStart(Thread2)).Start();
// Wait for Thread2 to signal that it has a result by setting
// finished to true.
for (;;){
if (finished) {
Console.WriteLine(“result = {0}”, result);
return;
}
}
}
}

可用于线程保护,一定程度上与lock类似

checked

关键字用于对整型类型算术运算和转换显式启用溢出检查。
默认情况下,如果表达式仅包含常量值,且产生的值在目标类型范围之外,则会导致编译器错误。 如果表达式包含一个或多个非常量值,则编译器不检测溢出。 在下面的示例中,计算赋给 i2 的表达式不会导致编译器错误。
int ten = 10;
int i2 = 2147483647 + ten;
默认情况下,在运行时也不检查这些非常量表达式是否溢出,这些表达式不引发溢出异常。 上面的示例显示 -2,147,483,639 作为两个正整数之和。
可以通过编译器选项、环境配置或使用 checked 关键字来启用溢出检查。 下面的示例演示如何使用 checked 表达式或 checked 块,在运行时检测由前面的求和计算导致的溢出。 两个示例都引发溢出异常。
1、Console.WriteLine(checked(2147483647 + ten));
2、checked
{
int i3 = 2147483647 + ten;
Console.WriteLine(i3);
}
可以使用 unchecked 关键字阻止溢出检查。

operator 和 implicit 或 explicit

关键字分别用于定义隐式转换或显式转换。 定义转换的类型必须是该转换的源类型或目标类型。 可用两种类型中的任何一种类型来定义两种用户定义类型之间的转换。
下面的示例展示如何定义隐式转换和显式转换:
using System;
public readonly struct Digit
{
private readonly byte digit;
public Digit(byte digit)
{
if (digit > 9)
{
throw new ArgumentOutOfRangeException(nameof(digit), “Digit cannot be greater than nine.”);
}
this.digit = digit;
}
public static implicit operator byte(Digit d) => d.digit;
public static explicit operator Digit(byte b) => new Digit(b);
public override string ToString() => $"{digit}";
}
public static class UserDefinedConversions
{
public static void Main()
{
var d = new Digit(7);
byte number = d;
Console.WriteLine(number); // output: 7
Digit digit = (Digit)number;
Console.WriteLine(digit); // output: 7
}
}
operator 关键字也可用于重载预定义的 C# 运算符。

sealed

应用于某个类时,sealed 修饰符可阻止其他类继承自该类。
还可以对替代基类中的虚方法或属性的方法或属性使用 sealed 修饰符。 这使你可以允许类派生自你的类并防止它们替代特定虚方法或属性。
在类中定义新方法或属性时,可以通过不将它们声明为虚拟,来防止派生类替代它们。
将 abstract 修饰符与密封类结合使用是错误的,因为抽象类必须由提供抽象方法或属性的实现的类来继承。
应用于方法或属性时,sealed 修饰符必须始终与 override 结合使用。
因为结构是隐式密封的,所以无法继承它们。

stackalloc 表达式

stackalloc 表达式在堆栈上分配内存块。 该方法返回时,将自动丢弃在方法执行期间创建的堆栈中分配的内存块。 不能显式释放使用 stackalloc 分配的内存。 堆栈中分配的内存块不受垃圾回收的影响,也不必通过 fixed 语句固定。
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/stackalloc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值