C#从未停止发展。 从Java和C ++的模仿混合开始,选择了它们最好的部分,这门语言就走自己的路,自己创新。随着第8版即将发布,让我们来看看最后定稿草案中最强有力的候选方案。
可以为null的引用类型
曾经,值类型不能为null,但是随着C#2中System.Nullable<T>的引入而改变了,尽管 '?'的句法糖 渲染字节的修饰符? 和System.Nullable<byte>可互换是最困难的。
当然,对于引用类型null总是合法的,但是这将通过扩展T来改变?引用类型的语法也允许:“开发人员表示引用类型的变量、参数或结果是否打算为null,并在没有根据该意图使用此类变量、参数和结果时提供警告”。
这使得以下情况成为可能:
class Person
{
//everyone has a first and a last name, but only some //people have a middle name.
public string FirstName; // Not null
public string? MiddleName; // May be null
public string LastName; // Not null
}
假设未加修饰的引用类型T的意图是它为non-null.。
默认接口方法
与Java类似的“默认方法”是引入“默认接口方法”,即与具体实现的接口中的方法。 与接口一样,接口问题在于扩展它们需要实现它们的所有类也进行更改以适应更改。
在此提议下,实现接口IA的C类不必强制实现IA的具体方法:
interface IA
{
void M() { WriteLine("IA.M"); }
}
class C : IA { }
此功能意味着接口的未来版本和扩展版本不必破坏现有代码。
固定大小的缓冲区
这主要是一个性能增强问题,但对于那些需要打破CLR管理边界的人来说尤为重要,比如与C DLL进行互操作时。
在这种情况下,您很可能偶然发现以下情况:
internal unsafe struct MyBuffer
{
public fixed uint Reserved[28]; //array of 28 uints
}
在 'fixed'的情况下,需要固定非托管dll使用的内存。
然而,这个操作必须被包装在一个 'unsafe'的上下文中,并伴随着它,所有相关的危险。
该提议希望托管代码能够与固定大小的数组一起工作,同时还能获得安全代码的好处,比如边界检查。'unsafe'必须离开。
您还可以通过使用MarshalAs以安全的方式与非托管代码进行交互,这应该是值得注意的。例如,前面的 'fixed'例子可以写成:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 28)]
public uint[] Reserved;
从我在UER应用程序中广泛使用的P/Invoke代码中获取的代码片段,它与WinRAR的用C++编写的unrar.dll进行互操作。 它需要一个定义为的结构:
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
public struct OpenArchiveDataEx_template
{
public string ArcName;
[MarshalAs(UnmanagedType.LPWStr)]
public string ArcNameW;
public uint OpenMode;
public uint OpenResult;
public string CmtBuf;
public uint CmtBufSize;
public uint CmtSize;
public uint CmtState;
public uint Flags;
public IntPtr Callback;
public int UserData;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 28)]
public uint[] Reserved;
...
[DllImport("unrar.dll",SetLastError=true)]
public static extern IntPtr RAROpenArchiveEx(ref OpenArchiveDataEx_template OpenArchiveDataEx_instance);
在这里,编译器负责托管到非托管通信,但是由于结构的分配和数据的编组而导致性能损失。'固定'然后,通过将指针传递给非托管结构允许直接通信,这些内容被转换 提高性能。 该提案以此为基础,允许固定缓冲区也用于安全环境。
在其余的提案中,突出的包括递归模式匹配,静态代理,协变返回和异步流。
更多信息
What's New in C# 8.0 - Mads Torgersen
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx