【4858.com】0四大新特色代码示例与解读,动态类型

By admin in 4858.com on 2019年4月5日

摘要:今日大家结合代码实例来具体看一下C#4.0中的四个相比首要的表征。

摘要:前天我们构成代码实例来具体看一下C#四.0中的多少个比较主要的特色。

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

摘要:今天我们构成代码实例来具体看一下C#四.0中的多个比较根本的风味。

  从前的稿子中,我们曾介绍过C#的历史及C# 四.0新增个性,包含:dynamic、
命名和可选参数、动态导入以及协变和逆变等。今日大家结合代码实例来具体看一下C#四.0中的多少个比较关键的天性。

  1.dynamic ExpandoObject

【4858.com】0四大新特色代码示例与解读,动态类型。  熟识js的仇敌都驾驭js能够如此写 :

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

  今后以此js动态语言的特征,大家也足以在c#中接纳了,前提是将3个变量申明为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#向动态语言过渡的1种试探吧。

  二.泛型自动转换

  在C# 四.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);
  }

  那一个法子有八个参数第二个是必选参数,第二个和第多个是可选参数,他们都有3个暗中同意值。

  那种格局对稳定参数的多少个办法重载很有用。如下调用:

   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);
    }

  那里又重载了1个DoSomething这么些法子有八个参数,但是尚未可选参数,

  实验阐明调用DoSomething(1,”arg”)时会优先实施未有可选参数的章程。

  4.主意参数之命名参数

  命名参数让大家得以在调用方法时钦点参数名字来给参数赋值,那种情景下能够忽略参数的11。如下方法注脚:

  
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中的四个相比重大的天性。
在此之前的稿子中,我们曾介…

  一、.net四.0至关心注重要新特征

  从前的篇章中,大家曾介绍过C#的历史及C# 4.0新增性格,包含:dynamic、
命名和可选参数、动态导入以及协变和逆变等。前些天我们构成代码实例来具体看一下C#四.0中的多个相比较重大的特点。

  在此之前的稿子中,我们曾介绍过C#的野史及C# 四.0新增本性,包罗:dynamic、
命名和可选参数、动态导入以及协变和逆变等。先天大家构成代码实例来具体看一下C#四.0中的几个比较首要的特色。


  1.dynamic ExpandoObject

  1.dynamic ExpandoObject

       
.Net四.0在.Net3.⑤基础上新增的最首要特点有:可选参数、命名参数和Dynamic。具体请阅黑里头片的那篇博文。这里大家最首要讲解C#四.0的Dynamic个性,对于别的特色大家可以在VS20十内尝试一下。不言而喻.Net在不断进步中。

  熟习js的恋人都知晓js能够如此写 :

  熟练js的对象都晓得js能够这么写 :

 

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

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

     二、ExpandoObject普通应用  

  未来以此js动态语言的特色,大家也得以在c#中采纳了,前提是将贰个变量申明为ExpandoObject类型。如下例:

  未来那个js动态语言的特征,大家也能够在c#中应用了,前提是将两个变量注脚为ExpandoObject类型。如下例:


    static void Main(string[] args)
  {

    static void Main(string[] args)
  {

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

        dynamic t = new ExpandoObject();

        dynamic t = new ExpandoObject();

 

        t.Abc =”abc”;

        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;
        Console.WriteLine(“t’s abc = {0},t’s value = {1}”, t.Abc,
t.Value);

        t.Value =10000;
        Console.WriteLine(“t’s abc = {0},t’s value = {1}”, t.Abc,
t.Value);

 

        Console.ReadLine();

        Console.ReadLine();

输出<< Lucy20True,那里已经接近javascript 的var obj ={}; obj.Name
=’lucy’。但又不相同,因为不可能在clr运维时动态生成属性或然措施。但起码比.NET三.5产业革命了。

  }

  }

 

  C#
4.0中新增了贰个命名空间System.Dynamic来完成对此采纳的支撑,那种用法的意思何在,以后自己还不太掌握,也是C#向动态语言过渡的壹种试探吧。

  C#
四.0中新增了1个命名空间System.Dynamic来促成对此采纳的帮忙,那种用法的含义何在,今后自个儿还不太明了,也是C#向动态语言过渡的1种试探吧。

    三、Dynamic 动态类型对DuckType
的协理

  2.泛型自动转换

  二.泛型自动转换


  在C# 肆.0在此之前上边包车型大巴代码是不可能编写翻译通过的

  在C# 4.0以前上面的代码是不可能编写翻译通过的

     
一.近日在园子里面看见了thinking的那篇博文,文中有那样1段代码:

   IEnumerable<object> objs = new List<string> { “I’m
0″,”I’am 1″,”I’am 2” };

   IEnumerable<object> objs = new List<string> { “I’m
0″,”I’am 1″,”I’am 2” };

 

  在C#
4.0中那种评释是允许的,不过也仅限于泛型接口,泛型类型的类似做法是区别意的,如下代码是有编写翻译错误的

  在C#
四.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” };

   List<object> objList = new List<string> { “I’am 0″,”I’am
1″,”I’am 2” };

return
(T)(d1 +
d2);
}
}

  3.方法参数之可选参数

  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);
  }

   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还有一个紧要的.Net肆.0特色有不可或缺谈到到,这也是本文重点研究的始末。

它正是:“DynamicObject”
该类位于System.Dynamic
命名空间下。在VS20十内就能够看见该类的分子列表,截图如下:

4858.com 1

 

所属方法都以虚方法,大家能够重写这个虚方法。那里最首要看TryInvokeMember()方法。那么些法子VS2010交给了详细的讲述。

听别人讲VS二〇〇八诠释,由于自家的VS2010是英文版的,那里就不贴出英文注脚了。简单介绍一下什么采用那几个法子:即便我们一个类OurClass它继续了DynamicObject
这些Class。OurClass中有3个方法OurMethod()。接着在OurClass 类中 重写
TryInvokeMember这几个基类虚方法。以上设置完后之后就算OurClass
的OurMethod方法壹旦被调用都先实施一下重写后的

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

 

 

1 function
tryInvokeMember(obj) {
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 () {
1陆
alert(‘已经找到ourMethod并且执行’);
17 };
18
19
tryInvokeMember(ourObj1);
20
tryInvokeMember(ourObj2);

 

世家读完那段js代码后应该会清楚怎么我要重点斟酌C#四.0中的DynamicObject了呢?真正的目标便是:在DuckType
类(鸭子)
方法(鸭子叫)执行从前,大家要认清指标的类是还是不是是具备鸭子叫的职能?假诺不持有就不应该执行,否则程序势必会抛出尤其。C#中如何贯彻啊?步骤如下:

      一、建立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;
}
}

 

     二、建立八个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 {
1二 return “人类是用Talk,而不是Quack”;
13 }
4858.com,14
}

 

    三、在Console 内 建立DuckType的调用方法:

1 public static string
DoQuack(dynamic animal)
2 {

  这一个措施有多少个参数第二个是必选参数,第三个和第多个是可选参数,他们都有一个暗中同意值。

  那个办法有五个参数第一个是必选参数,第四个和第十一个是可选参数,他们都有三个私下认可值。

3 string result

animal.Quack();
四 return result
?? “…人类自然不会鸭叫…”;
5
}

  
四、Console 内
Main方法调用:

 

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
}

 

程序执行结果如下:

4858.com 2
您是还是不是对.Net4.0 Dynamic 那些动态类型有了2个新的认识呢?

 

谈起底希望本篇小说能够给您带来支持,如有不足之处欢迎建议,感谢!

作者:RyanDing
出处:

  那种情势对一定参数的多少个艺术重载很有用。如下调用:

  那种样式对一定参数的多少个办法重载很有用。如下调用:

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

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

  大概你会想到,假诺我有三个和可选参数方法有些参数相同的艺术签名的艺术时,C#会怎么处理吧,我们看下上面包车型大巴代码

  恐怕你会想到,假设小编有三个和可选参数方法有些参数相同的诀窍签名的法门时,C#会怎么处理啊,我们看下下边包车型客车代码

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

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

  这里又重载了3个DoSomething那几个主意有五个参数,不过未有可选参数,

  这里又重载了2个DoSomething那一个方法有七个参数,可是未有可选参数,

  实验求证调用DoSomething(1,”arg”)时会优先执行没有可选参数的艺术。

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

  肆.主意参数之命名参数

  四.艺术参数之命名参数

  命名参数让大家能够在调用方法时钦赐参数名字来给参数赋值,那种情状下得以忽略参数的顺序。如下方法申明:

  命名参数让我们可以在调用方法时钦命参数名字来给参数赋值,那种景色下得以忽略参数的依次。如下方法注明:

  
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 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();
  }

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

  很明朗的那是三个语法糖,可是在章程参数很多的情景下很有意义,能够扩展代码的可读性。

  很肯定的这是1个语法糖,不过在章程参数很多的图景下很有含义,能够追加代码的可读性。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有