Vistual Stdio 2022 C# 11新语法备忘

Vistual Stdio 2022正式版发布有一段时间了,新版支持C# 11,新增加了语法,部分调用方法也有说改变,记录一下也方便自己以后备查。

1、顶级语句

默认在program.cs生成的就是没有using,没有namespace,没有class和main入口的语句。经典的”hello world!“可以简单的写成

Console.WriteLine("Hello, World!");

需要注意的是,每个项目中仅允许一个文件有顶级语句。这容易理解,如果有多个文件存在顶级语句,执行时无法识别从哪里开始执行。

顶级语句文件中,同样可以写函数之类的。

做个小测试可以更加明白。

Program.cs
---------------------------------------
using System.Diagnostics;
using System.Reflection;


StackTrace trace = new();
StackFrame frame = trace.GetFrame(0);
MethodBase method = frame.GetMethod();
Console.WriteLine($"class: {method.ReflectedType.FullName}, method: {method.Name}");

PascalMing.ClassTest test = new ();
test.Do();

ClassTest.cs
---------------------------------------
using System.Diagnostics;
using System.Reflection;

namespace PascalMing;
class ClassTest
{
    public void Do()
    {
        StackTrace trace = new();
        StackFrame frame = trace.GetFrame(0);
        MethodBase method = frame.GetMethod();
        Console.WriteLine($"class: {method.ReflectedType.FullName}, method: {method.Name}");

    }
}

2、switch语句

    示例如下:

    public string TypeName()
    {
        return (TDengineDataType)type switch
        {
            TDengineDataType.TSDB_DATA_TYPE_BOOL => "BOOL",
            TDengineDataType.TSDB_DATA_TYPE_TINYINT => "TINYINT",
            TDengineDataType.TSDB_DATA_TYPE_SMALLINT => "SMALLINT",
            TDengineDataType.TSDB_DATA_TYPE_INT => "INT",
            TDengineDataType.TSDB_DATA_TYPE_BIGINT => "BIGINT",
            TDengineDataType.TSDB_DATA_TYPE_UTINYINT => "TINYINT UNSIGNED",
            TDengineDataType.TSDB_DATA_TYPE_USMALLINT => "SMALLINT UNSIGNED",
            TDengineDataType.TSDB_DATA_TYPE_UINT => "INT UNSIGNED",
			TDengineDataType.TSDB_DATA_TYPE_UBIGINT => "BIGINT UNSIGNED",
            TDengineDataType.TSDB_DATA_TYPE_FLOAT => "FLOAT",
            TDengineDataType.TSDB_DATA_TYPE_DOUBLE => "DOUBLE",
            TDengineDataType.TSDB_DATA_TYPE_BINARY => "STRING",
            TDengineDataType.TSDB_DATA_TYPE_TIMESTAMP => "TIMESTAMP",
            TDengineDataType.TSDB_DATA_TYPE_NCHAR => "NCHAR",
            _ => "undefine",
        };
    }

3、更加简洁的new

之前定义了类ClassTest,可以更简洁的定义,参考:

PascalMing.ClassTest test = new ();

4、Encoding问题

     Encoding编码和解码直接使用报错,需要做小的调整。

     Encoding需要在NuGet包中安装包System.Text.Encoding.CodePages并在使用前注册。

     调用前先初始化,然后调用,参考:

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Encoding encoding = Encoding.GetEncoding("gb2312");

5、null问题

        对象定义时,默认增加null检查,如果允许为空,定义时需要做在类后面增加”?“符号。如

PascalMing.ClassTest? test;

如果不需要,可以在.csproj工程文件中增加一行

  
    disable
  

你可能感兴趣的:(编程,c#,visual,studio)