您的位置:新葡亰496net > 奥门新萄京娱乐场 > 新葡亰496net:基本语法,0四大新特性代码示例与

新葡亰496net:基本语法,0四大新特性代码示例与

发布时间:2019-06-19 12:40编辑:奥门新萄京娱乐场浏览(118)

    摘要:后天我们构成代码实例来具体看一下C#4.0中的四个相比重要的特点。

    11年 C# 4.0四大新特点代码示例与解读,

    摘要:明日大家结合代码实例来具体看一下C#4.0中的多个相比关键的特色。

      以前的作品中,大家曾介绍过C#的历史及C# 4.0新扩展天性,包含:dynamic、 命名和可选参数、动态导入以及协变和逆变等。后天大家构成代码实例来具体看一下C#4.0中的四个比较重大的特点。

      1.dynamic ExpandoObject

      熟谙js的相爱的人都精通js能够这么写 :

    var t = new Object(); t.Abc = ‘something’; t.Value =243;

      以往那一个js动态语言的特征,大家也足以在c#中选择了,前提是将叁个变量声明为ExpandoObject类型。如下例:

        static void Main(string[] args)
      {         dynamic t = new ExpandoObject();         t.Abc ="abc";         t.Value =10000;
            Console.WriteLine("t's abc = {0},t's value = {1}", t.Abc, t.Value);         Console.ReadLine();

      }

      C# 4.0中新扩展了八个命名空间System.Dynamic来兑现对此采纳的协理,这种用法的意思何在,以往自家还不太领悟,也是C#向动态语言过渡的一种试探吧。

      2.泛型自动调换

      在C# 4.0事先上边包车型的士代码是不得以编译通过的

       IEnumerable<object> objs = new List<string> { "I'm 0","I'am 1","I'am 2" };

      在C# 4.0中这种表明是同意的,不过也只限于泛型接口,泛型类型的切近做法是不一样意的,如下代码是有编写翻译错误的

       List<object> objList = new List<string> { "I'am 0","I'am 1","I'am 2" };

      3.方法参数之可选参数

      如下方法注脚的语法

       static void DoSomething(int notOptionalArg, string arg1 ="default Arg1", string arg2 ="default arg2")
      {
          Console.WriteLine("arg1 = {0},arg2 = {1}",arg1,arg2);
      }

      那几个艺术有四个参数第一个是必选参数,第四个和第多少个是可选参数,他们都有一个暗中认可值。

      这种样式对稳定参数的几个措施重载很有用。如下调用:

       static void Main(string[] args)
      {
            DoSomething(1);
            DoSomething(1, "葫芦");
            DoSomething(1, "葫芦", "黄瓜");
            Console.ReadLine();
      }

      恐怕你会想到,假设小编有三个和可选参数方法有些参数一样的点子具名的点猪时,C#会怎么管理啊,大家看下下边包车型客车代码

       static void DoSomething(int notOpArg, string arg)
      {
            Console.WriteLine("arg1 = {0}", arg);
        }

      这里又重载了三个DoSomething这么些艺术有七个参数,然则并未可选参数,

      实验验证调用DoSomething(1,”arg”)时会优先实行未有可选参数的点子。

      4.措施参数之命名参数

      命名参数让大家得以在调用方法时钦命参数名字来给参数赋值,这种境况下能够忽略参数的相继。如下方法证明:

       static void DoSomething(int height, int width, string openerName, string scroll)
      {
            Console.WriteLine("height = {0},width = {1},openerName = {2}, scroll = {3}",height,width,openerName,scroll);
      }

      我们得以如此来调用上边评释的点子

       static void Main(string[] args)
      {
          DoSomething( scroll : "no",height : 10, width : 5, openerName : "windowname");
          Console.ReadLine();
      }

      很通晓的那是四个语法糖,但是在艺术参数繁多的动静下很有意义,可以追加代码的可读性。

    C# 4.0四大新风味代码示例与解读, 摘要:后天大家构成代码实例来具体看一下C#4.0中的多少个相比重大的表征。 在此之前的篇章中,大家曾介...

      一、.net4.0关键新性子

    初稿发布时间为:二〇一三-12-25 —— 来源于本身的百度小说 [由搬家工具导入]

      从前的稿子中,大家曾介绍过C#的野史及C# 4.0新扩充特性,包罗:dynamic、 命名和可选参数、动态导入以及协变和逆变等。先天大家结合代码实例来具体看一下C#4.0中的多个相比较根本的风味。


    public static class DictionaryExt
        {

      1.dynamic ExpandoObject

            .Net4.0在.Net3.5基础上增加产量的重大特点有:可选参数、命名参数和Dynamic。具体请阅鱼脍的那篇博文。这里大家任重(英文名:rèn zhòng)而道远疏解C#4.0的Dynamic特性,对于别的特色大家能够在VS2008内尝试一下。综上说述.Net在不断进步级中学。

            /// <summary>
            /// Extension method that turns a dictionary of string and object to an ExpandoObject
            /// </summary>
            public static ExpandoObject ToExpando(this IDictionary<string, object> dictionary)
            {
                var expando = new ExpandoObject();
                var expandoDic = (IDictionary<string, object>)expando;

      熟谙js的爱侣都知晓js能够如此写 :

     

                // go through the items in the dictionary and copy over the key value pairs)
                foreach (var kvp in dictionary)
                {
                    // if the value can also be turned into an ExpandoObject, then do it!
                    if (kvp.Value is IDictionary<string, object>)
                    {
                        var expandoValue = ((IDictionary<string, object>)kvp.Value).ToExpando();
                        expandoDic.Add(kvp.Key, expandoValue);
                    }
                    else if (kvp.Value is ICollection)
                    {
                        // iterate through the collection and convert any strin-object dictionaries
                        // along the way into expando objects
                        var itemList = new List<object>();
                        foreach (var item in (ICollection)kvp.Value)
                        {
                            if (item is IDictionary<string, object>)
                            {
                                var expandoItem = ((IDictionary<string, object>)item).ToExpando();
                                itemList.Add(expandoItem);
                            }
                            else
                            {
                                itemList.Add(item);
                            }
                        }

    var t = new Object(); t.Abc = ‘something’; t.Value =243;

         二、ExpandoObject普通应用  

                        expandoDic.Add(kvp.Key, itemList);
                    }
                    else
                    {
                        expandoDic.Add(kvp);
                    }
                }

      以往那个js动态语言的风味,我们也得以在c#中选拔了,前提是将二个变量表明为ExpandoObject类型。如下例:


                return expando;
            }
        }

        static void Main(string[] args)
      {

           ExpandoObject 类,“需引用System.Dynamic命名空间” 。请看以下代码:       

    ===============Demo==============

            dynamic t = new ExpandoObject();

     

     public class Program
        {
            static void Main(string[] args)
            {
                var model = new Dictionary<string, object> { { "Name", "Jack" }, { "Age", 13 }, { "Married", false },
                    {"Girlfriend",new Dictionary<string, object> { { "Name", "Lucy" }, { "Age", 13 }, { "Married", true }}}
                };
                dynamic result = model.ToExpando();
                Console.WriteLine(result.Name);
                Console.WriteLine(result.Girlfriend.Name);
                Console.ReadLine();
            }
        }

            t.Abc ="abc";

    dynamic Customer = new ExpandoObject();
    Customer.Name = "Lucy";
    Customer.Age = 20;
    Customer.Female = true;
    Console.WriteLine(Customer.Name Customer.Age Customer.Female);
    Console.ReadKey();   

            t.Value =10000;
    新葡亰496net:基本语法,0四大新特性代码示例与解读。        Console.WriteLine("t's abc = {0},t's value = {1}", t.Abc, t.Value);

     

            Console.ReadLine();

    出口<< Lucy20True,这里已经临近javascript 的var obj ={}; obj.Name ='lucy'。但又大有不同,因为不可能在clr运转时动态生成属性或然措施。但起码比.NET3.5红旗了。

      }

     

      C# 4.0中新扩展了二个命名空间System.Dynamic来落到实处对此选用的帮助,这种用法的含义何在,今后自己还不太精通,也是C#向动态语言过渡的一种试探吧。

        三、Dynamic 动态类型对DuckType 的支撑

      2.泛型自动转变


      在C# 4.0事先上边包车型客车代码是不得以编译通过的

          1.方今在园子里面看见了thinking的那篇博文,文中有这么一段代码:

       IEnumerable<object> objs = new List<string> { "I'm 0","I'am 1","I'am 2" };

     

      在C# 4.0中这种注脚是同意的,可是也只限于泛型接口,泛型类型的近乎做法是不允许的,如下代码是有编写翻译错误的

    static class Calculator {
    public static T Add<T>(T t1, T t2) {
    dynamic d1 = t1;
    dynamic d2 = t2;

       List<object> objList = new List<string> { "I'am 0","I'am 1","I'am 2" };

    return (T)(d1 d2);
    }
    }

      3.方法参数之可选参数

    public static void Main(string[] args){
    int i = Calculator.Add(1, 2);

      如下方法注明的语法

    double d

    Calculator.Add(1.1, 2.2);

       static void DoSomething(int notOptionalArg, string arg1 ="default Arg1", string arg2 ="default arg2")
      {
          Console.WriteLine("arg1 = {0},arg2 = {1}",arg1,arg2);
      }

    string s

    Calculator.Add("abc", "def");

    Console.WriteLine(i " " d " " s);

    }

     

    输出:

    >>3 3.3 abcdef

    笔者在文中建议了以上C#代码是为着通过动态类型来贯彻基于duck typing的泛型参数约束。

    为了在C#支撑Duck Type还恐怕有贰个重大的.Net4.0特色有须要提起到,那也是本文珍视商议的始末。

    它便是:“DynamicObject” 该类位于System.Dynamic 命名空间下。在VS二零零六内就可以望见该类的分子列表,截图如下:

    新葡亰496net 1

     

    所属方法都是虚方法,咱们能够重写那些虚方法。这里根本看TryInvokeMember()方法。这么些办法VS二零一零交到了详尽的讲述。

    据说VS二〇一〇解说,由于自个儿的VS2008是英文版的,这里就不贴出英文申明了。简要介绍一下哪些运用那些办法:假若我们一个类OurClass它一而再了DynamicObject 那一个Class。OurClass中有三个方法OurMethod()。接着在OurClass 类中 重写 TryInvokeMember这几个基类虚方法。以上设置完后之后即使OurClass 的OurMethod方法一旦被调用都先进行一下重写后的

       TryInvokeMember()方法。大概你会问那样到底有啥用途?OK!请先看javascript这段代码片段:

     

     

    1 function tryInvokeMember(obj) {
    新葡亰496net:基本语法,0四大新特性代码示例与解读。 2 if (obj && typeof obj.ourMethod === "function") {
    3 return obj.ourMethod();
    4 }
    5 alert('未找到!');
    6 return null;
    7 }
    8
    9 var ourObj1 = {};
    10 ourObj1.Method = function () {
    11 alert('111');
    12 };
    13
    14 var ourObj2 = {};
    15 ourObj2.ourMethod = function () {
    16 alert('已经找到ourMethod并且实行');
    17 };
    18
    19 tryInvokeMember(ourObj1);
    20 tryInvokeMember(ourObj2);

     

    大家读完这段js代码后应该会知道为何本身要首要切磋C#4.0中的DynamicObject了呢?真正的目标便是:在DuckType 类(鸭子) 方法(鸭子叫)试行在此以前,大家要一口咬定指标的类是或不是是具有鸭子叫的效益?借使不负有就不应有实施,不然程序势必会抛出卓殊。C#中什么贯彻吗?步骤如下:

          1、建构DynamicAnimal 类承接DynamicObject类,并且重写TryInvokeMember虚方法:

     

     

    public class DynamicAnimal : DynamicObject
    {
    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
    bool success = base.TryInvokeMember(binder, args, out result);

    //如若措施不存在,请将result 那个out参数赋值为null
    if (!success)
    result = null;

    //如若那一个地点回到false 将会抓住这些
    return true;
    }
    }

     

         2、建立几个DuckType类,分别为Duck 和 Human:

     

    1 public class Duck : DynamicAnimal
    2 {
    3 public string Quack()
    4 {
    5 return "鸭子嘛,就Quack吧!";
    6 }
    7 }
    8  public class Human : DynamicAnimal
    9 {
    10 public string Talk()
    11 {
    12 return "人类是用Talk,而不是Quack";
    13 }
    14 }

     

        3、在Console 内 建构DuckType的调用方法:

    1 public static string DoQuack(dynamic animal)
    2 {

      这些主意有七个参数第贰个是必选参数,第三个和第八个是可选参数,他们都有多少个暗中同意值。

    3 string result

    animal.Quack();
    4 return result ?? "...人类自然不会鸭叫...";
    5 }

       4、Console 内 Main方法调用:

     

    新葡亰496net, 1 static void Main(string[] args)
    2 {
    3 var duck = new Duck();
    4 var cow = new Human();
    5 Console.WriteLine("鸭子是Quack");
    6 Console.WriteLine(DoQuack(duck));
    7 Console.WriteLine("人类是talk");
    8 Console.WriteLine(DoQuack(cow));
    9 Console.ReadKey();
    10 }

     

    程序试行结果如下:

    新葡亰496net 2
    你是或不是对.Net4.0 Dynamic 这一个动态类型有了五个新的认知呢?

     

    末尾希望本篇小说能够给你带来协助,如有不足之处迎接提出,感激!

    作者:RyanDing
    出处:

      这种样式对固定参数的多少个法子重载很有用。如下调用:

       static void Main(string[] args)
      {
            DoSomething(1);
            DoSomething(1, "葫芦");
            DoSomething(1, "葫芦", "黄瓜");
            Console.ReadLine();
      }

      只怕你会想到,假诺本人有贰个和可选参数方法某些参数一样的法子具名的办法时,C#会怎么处理呢,大家看下下边包车型地铁代码

       static void DoSomething(int notOpArg, string arg)
      {
            Console.WriteLine("arg1 = {0}", arg);
        }

      这里又重载了八个DoSomething那些主意有多少个参数,但是未有可选参数,

      实验求证调用DoSomething(1,”arg”)时会优先推行未有可选参数的办法。

      4.方式参数之命名参数

      命名参数让大家能够在调用方法时钦定参数名字来给参数赋值,这种景色下可以忽略参数的依次。如下方法证明:

       static void DoSomething(int height, int width, string openerName, string scroll)
      {
            Console.WriteLine("height = {0},width = {1},openerName = {2}, scroll = {3}",height,width,openerName,scroll);
      }

      咱俩得以这么来调用上边表明的办法

       static void Main(string[] args)
      {
          DoSomething( scroll : "no",height : 10, width : 5, openerName : "windowname");
          Console.ReadLine();
      }

      很显著的那是三个语法糖,不过在艺术参数许多的情况下很有意义,能够扩张代码的可读性。

    本文由新葡亰496net发布于奥门新萄京娱乐场,转载请注明出处:新葡亰496net:基本语法,0四大新特性代码示例与

    关键词: