欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

弃元

程序员文章站 2022-05-29 08:38:05
弃元就是使用下划线_作为一个占位符,但不占存储空间。 元组(ValueTuple、Tuple)使用弃元例子。 using System; namespace ConsoleApp4 { class Program { public static void Main() { // ValueTuple ......

弃元就是使用下划线_作为一个占位符,但不占存储空间。

元组(valuetuple、tuple)使用弃元例子。

using system;

namespace consoleapp4
{
    class program
    {
        public static void main()
        {
            // valuetuple和tuple都可以使用弃元
            var (_, _, _, pop1, _, pop2) = querycitydataforyears("new york city", 1960, 2010);
           
            console.writeline($"population change, 1960 to 2010: {pop2 - pop1:n0}");
        }

        private static (string,double,int,int,int,int) querycitydataforyears(string name,int year1,int year2)
        {
            int population1 = 0, population2 = 0;
            double area = 0;

            if (name == "new york city")
            {
                area = 468.48;
                if (year1 == 1960)
                {
                    population1 = 7781984;
                }
                if (year2 == 2010)
                {
                    population2 = 8175133;
                }
                return (name, area, year1, population1, year2, population2);
            }
            return ("", 0, 0, 0, 0, 0);
            }     
    }   
}

对象析构,析构函数的参数决定了元组的参数 。

using system;

namespace consoleapp4
{
    class program
    {
        public static void main()
        {
            var p = new person("john", "quincy", "adams", "boston", "ma");

            // deconstruct(out string fname, out string lname, out string city, out string state) 
            var (fname,_,city,_) = p;
          
            console.writeline($"hello {fname} of {city}!");            
        }

        private static (string,double,int,int,int,int) querycitydataforyears(string name,int year1,int year2)
        {
            int population1 = 0, population2 = 0;
            double area = 0;

            if (name == "new york city")
            {
                area = 468.48;
                if (year1 == 1960)
                {
                    population1 = 7781984;
                }
                if (year2 == 2010)
                {
                    population2 = 8175133;
                }
                return (name, area, year1, population1, year2, population2);
            }
            return ("", 0, 0, 0, 0, 0);
            }     
    }

    public class person
    {
        public string firstname { get; set; }
        public string middlename { get; set; }
        public string lastname { get; set; }
        public string city { get; set; }
        public string state { get; set; }

        public person(string fname, string mname, string lname,
                      string cityname, string statename)
        {
            firstname = fname;
            middlename = mname;
            lastname = lname;
            city = cityname;
            state = statename;
        }

        // 返回firstname、lastname的元组
        public void deconstruct(out string fname,out string lname)
        {
            fname = firstname;
            lname = lastname;
        }        

        public void deconstruct(out string fname, out string mname, out string lname)
        {
            fname = firstname;
            mname = middlename;
            lname = lastname;
        }

        public void deconstruct(out string fname, out string lname,
                                out string city, out string state)
        {
            fname = firstname;
            lname = lastname;
            city = city;
            state = state;
        }
    }
}

switch,case分支可以使用占位符,相当default的作用。

using system;
using system.globalization;

namespace consoleapp4
{
    class program
    {
        public static void main()
        {
            object[] objects = { cultureinfo.currentculture,
                           cultureinfo.currentculture.datetimeformat,
                           cultureinfo.currentculture.numberformat,
                           new argumentexception(), null };
            foreach (var obj in objects)
                providesformatinfo(obj);

            console.readline();
        }

        private static void providesformatinfo(object obj)
        {
            switch (obj)
            {
                // 实现了iformatprovider,if obj is iformatprovider fmt 
                case iformatprovider fmt:
                    console.writeline($"{fmt} object");
                    break;
                case null:
                    console.writeline("null");
                    break;
                case object _:
                    console.writeline("without format information");
                    break;
            }
        }      
    }
}

具有out参数的调用方法,有时只想知道是否能转换而不需要其转换之后的值。

 bool isdate = datetime.tryparse("8989", out _);

独立的弃元 (好像没有用....)

 _ = "";

 

当上下文存在下划线标识符,则无法再用下划线作为占位符,即不能使用弃元。

private static void showvalue(int _)
{
    byte[] arr = { 0, 0, 1, 2 };
    // 此时无法作为占位符,因为和参数的有效标识符冲突
    _ = bitconverter.toint32(arr, 0);
    console.writeline(_);
}
// the example displays the following output:
//       33619968
private static void showvalue(int _)
{
    string value = _.tostring();
    int newvalue = 0;
    // 无法作为占位符,类型和参数标识符_也不一样,编译报错
    _ = int32.tryparse(value, out newvalue);
    return _ == newvalue;
}       

 

推荐阅读