defualt关键字默认值用法,1中default关键字的新用法

default 关键字有两类用法

暗中同意值表达式生成类型的暗许值。 暗中认可值表明式在泛型类和泛型方法中特别管用。 使用泛型类和泛型方法时出现的一个难点是,怎样在无法提前领略以下内容的情事下将私下认可值赋值给参数化类型 T

从 C# 7.1 发轫,当编写翻译器可以测算表明式的品种时,文本 default
可用于默许值表明式。 文本 default 生成与等效项 default(T)(其中,T
是估摸的项目卡塔 尔(阿拉伯语:قطر‎相通的值。
那可减少数次宣称类型的冗余,进而使代码尤其简明。 文本 default
可用于以下任一人置:

  1. switch语句中指定暗中认可标签
  2. 默许值表明式
  • T 是援用类型大概值类型。
  • 如果 T 是值类型,它是数值照旧客户定义的协会。
  • 变量开头值设定项
  • 变量赋值
  • 宣称可选参数的暗中认可值
  • 为形式调用参数提供值
  • 再次回到语句(或 expression bodied 成员中的表明式卡塔尔

switch 语句

      int caseSwitch = 1;

      switch (caseSwitch)
      {
          case 1:
              Console.WriteLine("Case 1");
              break;
          case 2:
              Console.WriteLine("Case 2");
              break;
          default:
              Console.WriteLine("Default case");
              break;
      }

已知参数化类型 T 的变量 t,仅当 T 为引用类型时,语句 t = null 才有效。 赋值 t = 0 仅对数值类型有效,对协会无效。 解决方案是选拔暗许值表明式,该表明式对引用类型(类类型和接口类型卡塔尔国再次回到 null,对数值类型重临零。 对于客户定义的协会,重临伊始化为零位方式的布局,该组织根据成员是值照旧援用类型,为种种成员变动
0 或 null。 对于可为 NULL
的值类型,default 再次回到像任何组织相通开头化的System.Nullable<T>。

以下示例浮现了文本 default 在暗中同意值表明式中的各样用法:

暗中认可值表明式

default对应各体系型生成默许值列表如下:
|类型|默认值|
|-|-|
|任何援用类型|null|
|数值类型|零|
|bool|false|
|enum|表达式 (E)0 生成的值,个中 E 是枚举标志符。|
|struct|通过如下设置生成的值:将兼具值类型的字段设置为其暗中认可值,将具有援引类型的字段设置为null。|
|可以为 null 的类型|HasValue 属性为 false 且 Value 属性未定义的实例。|

位列一下上述列表中的经常见到类型对应的值

在C# 7.1 之前

default(string) // null
default(int) // 0
default(int?) // null
default(dynamic) // null
default(DateTime) // 0001/01/01 0:00:00
default(DateTime?) // null

default(T) 表明式不限于泛型类和泛型方法。 默许值表明式可用于其余托管类型

public class Point
{
    public double X { get; }
    public double Y { get; }

    public Point(double x, double y)
    {
        X = x;
        Y = y;
    }
}

public class LabeledPoint
{
    public double X { get; private set; }
    public double Y { get; private set; }
    public string Label { get; set; }

    // Providing the value for a default argument:
    public LabeledPoint(double x, double y, string label = default)
    {
        X = x;
        Y = y;
        this.Label = label;
    }

    public static LabeledPoint MovePoint(LabeledPoint source, 
        double xDistance, double yDistance)
    {
        // return a default value:
        if (source == null)
            return default;

        return new LabeledPoint(source.X + xDistance, source.Y + yDistance, 
        source.Label);
    }

    public static LabeledPoint FindClosestLocation(IEnumerable<LabeledPoint> sequence, 
        Point location)
    {
        // initialize variable:
        LabeledPoint rVal = default;
        double distance = double.MaxValue;

        foreach (var pt in sequence)
        {
            var thisDistance = Math.Sqrt((pt.X - location.X) * (pt.X - location.X) +
                (pt.Y - location.Y) * (pt.Y - location.Y));
            if (thisDistance < distance)
            {
                distance = thisDistance;
                rVal = pt;
            }
        }

        return rVal;
    }

    public static LabeledPoint ClosestToOrigin(IEnumerable<LabeledPoint> sequence)
        // Pass default value of an argument.
        => FindClosestLocation(sequence, default);
}

私下认可文本和项目推理

C# 7.1 default的应用大面积比方
Visual Studio 2017 默认C#言语版本是7.0,须求团结安装7.1
Alt+Enter飞速键打开项目性质,恐怕右键点击项目,选用属性,之后选拔生成,点击高端,如下图
图片 1

开采高等生成设置,选用语言版本,选C# 7.1 及以上的本子,如下图
图片 2

设若未有C# 7.1 及以上的本子可选,请下载.NET Framework
4.7.2,以后新星版本的是4.7.2,直接下载最新版本的,省事。然后重启VS,就会来看7.1及以上的可选项。

以上内容出自MSDN。

 

变量早先值设定项

7.1之前:

            var dstring = default(string);
            var dint = default(int);
            var dintNull = default(int?);
            var d = default(dynamic);
            var dt = default(DateTime);
            var dt1 = default(DateTime?);

7.1:

            string s = default;
            int i = default;
            DateTime? dt = default;
            dynamic d = default;

亲自去做代码:

变量赋值

7.1之前:

            var s = "字符串";
            s = default(string);            

7.1:

           var s = "字符串";
            s = default;

 

声称可选参数的暗中同意值

7.1之前:

        void Test(int a, string b = null)
        {

        }           

7.1:

        void Test(int a, string b = default)
        {

        }

int iValue = default(int);
float fValue = default(float);
decimal dValue = default(decimal);
Console.Write(“值类型测验:”);
Console.WriteLine(“{0},{1},{2}”, iValue, fValue, dValue);

为艺术调用参数提供值

7.1之前:

        static void Test(int a, string b)
        {

        } 
        static void Main(string[] args)
        { 
            Test(0, null);
        } 

7.1:

        static void Test(int a, string b)
        {

        }
        static void Main(string[] args)
        { 
            Test(default, default);
        } 

string strValue = default(string);
DateTime? dt = default(DateTime?);
User user = default(User);
Console.Write(“援引类型测量检验:”);
Console.WriteLine(“{0},{1},{2}”, (null == strValue), (null == user),
(null == dt));
Console.WriteLine();

回到语句

7.1之前:

        static string Test()
        {
            return null;
        }

7.1:

        static string Test()
        {
            return default;
        }

 

expression bodied 成员中的表明式

7.1之前:

public string A => null;

7.1:

public string A => default;

参考:暗中认可值表明式(C#
编制程序指南卡塔尔

运作结果:
图片 3