0四大新特点代码示例与解读,动态类型

摘要:前日大家构成代码实例来具体看一下C#4.0中的五个比较重大的性状。

摘要:明天大家构成代码实例来具体看一下C#四.0中的多少个相比较关键的特征。

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

摘要:今天大家结合代码实例来具体看一下C#四.0中的八个相比较重要的风味。

  以前的稿子中,我们曾介绍过C#的历史及C# 四.0新扩充天性,包罗:dynamic、
命名和可选参数、动态导入以及协变和逆变等。后天我们结合代码实例来具体看一下C#肆.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#
四.0中新扩展了三个命名空间System.Dynamic来促成对此选用的帮忙,那种用法的意义何在,未来自家还不太领会,也是C#向动态语言过渡的①种试探吧。

  2.泛型自动转变

  在C# 四.0在此以前上边包车型客车代码是不得以编译通过的

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

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

  那里又重载了一个DoSomething那些方法有多少个参数,不过未有可选参数,

  实验求证调用DoSomething(一,”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 Main(string[] args)
  {
      DoSomething( scroll : “no”,height : 10, width : 5, openerName
: “windowname”);
      Console.ReadLine();
  }

  很分明的那是三个语法糖,可是在措施参数许多的图景下很有意义,能够扩大代码的可读性。

C# 四.0四大新特色代码示例与解读,
摘要:明天我们构成代码实例来具体看一下C#四.0中的四个比较主要的个性。
以前的小说中,大家曾介…

  一、.net4.0至关心注重要新本性

  此前的小说中,大家曾介绍过C#的野史及C# 四.0新扩充脾气,包含:dynamic、
命名和可选参数、动态导入以及协变和逆变等。前天我们结合代码实例来具体看一下C#四.0中的多个比较根本的风味。

  在此之前的篇章中,大家曾介绍过C#的历史及C# 4.0新增添个性,包涵:dynamic、
命名和可选参数、动态导入以及协变和逆变等。明天我们构成代码实例来具体看一下C#四.0中的多少个相比主要的特色。


  1.dynamic ExpandoObject

  1.dynamic ExpandoObject

       
.Net四.0在.Net三.五基础上新扩张的基本点特征有:可选参数、命名参数和Dynamic。具体请阅生鱼片的那篇博文。那里大家最首要解说C#4.0的Dynamic个性,对于其余特色大家能够在VS2010内尝试一下。不问可见.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;

     2、ExpandoObject普通应用  

  今后以此js动态语言的特征,大家也得以在c#中应用了,前提是将三个变量注脚为ExpandoObject类型。如下例:

  今后那么些js动态语言的特点,我们也足以在c#中使用了,前提是将3个变量注明为ExpandoObject类型。如下例:


    static void Main(string[] args)
  {

    static void Main(string[] args)
  {

0四大新特点代码示例与解读,动态类型。       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();

出口<< 露茜20True,那里曾经8玖不离10javascript 的var obj ={}; obj.Name
=’lucy’。但又大有径庭,因为无法在clr运维时动态生成属性或许措施。但起码比.NET三.5Red Banner了。

  }

  }

 

  C#
四.0中新扩充了1个命名空间System.Dynamic来促成对此选取的补助,那种用法的含义何在,现在自己还不太知道,也是C#向动态语言过渡的1种试探吧。

  C#
4.0中新扩张了2个命名空间System.Dynamic来落成对此采用的支持,那种用法的意思何在,现在自家还不太明了,也是C#向动态语言过渡的一种试探吧。

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

  二.泛型自动转变

  二.泛型自动转变


  在C# 四.0事先上边包车型地铁代码是不能够编写翻译通过的

  在C# 4.0从前上边的代码是无法编写翻译通过的

     
一.方今在园子里面看见了thinking的那篇博文,文中有诸如此类一段代码:

   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#
四.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拾内就能够看见该类的成员列表,截图如下:

美高梅开户网址 1

 

所属方法都以虚方法,大家可以重写那些虚方法。那里根本看TryInvokeMember()方法。这么些法子VS20十提交了详尽的讲述。

依据VS20拾批注,由于自个儿的VS2010是英文版的,那里就不贴出英文评释了。简要介绍一下如何选用那个点子:假若大家一个类OurClass它一而再了DynamicObject
那几个Class。OurClass中有一个方法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#中哪些促成啊?步骤如下:

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

 

     二、建立三个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 }
14
}

 

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

1 public static string
DoQuack(dynamic animal)
2 {

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

  这些方法有多个参数第二个是必选参数,第二个和第多个是可选参数,他们都有3个默许值。

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
}

 

程序实践结果如下:

美高梅开户网址 2
你是或不是对.Net四.0 Dynamic 这几个动态类型有了一个新的认识呢?

 

末尾希望本篇小说可以给你带来帮忙,如有不足之处接待提议,谢谢!

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

  可能你会想到,假诺我有1个和可选参数方法某些参数一样的措施具名的艺术时,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);
    }

  这里又重载了四个DoSomething那个主意有多少个参数,不过未有可选参数,

  那里又重载了多少个DoSomething那么些方法有八个参数,可是从未可选参数,

  实验评释调用DoSomething(一,”arg”)时会优先试行未有可选参数的格局。

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

  四.办法参数之命名参数

  4.措施参数之命名参数

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

  命名参数让我们能够在调用方法时钦定参数名字来给参数赋值,那种状态下可以忽略参数的逐1。如下方法评释:

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

  很鲜明的那是2个语法糖,然而在艺术参数许多的地方下很有意义,能够增添代码的可读性。

  很醒目标这是3个语法糖,不过在方式参数许多的情状下很有含义,能够增添代码的可读性。

发表评论

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

网站地图xml地图