主导语法,0第四次全国代表大会新风味代码示例与解读

摘要:前些天大家结合代码实例来具体看一下C#4.0中的多个相比较重大的特点。

摘要:后天大家构成代码实例来具体看一下C#肆.0中的五个相比根本的特征。

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

摘要:明日大家构成代码实例来具体看一下C#肆.0中的多少个相比根本的性格。

  此前的稿子中,我们曾介绍过C#的历史及C# 四.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#
肆.0中新增添了3个命名空间System.Dynamic来完成对此选择的支撑,那种用法的含义何在,以后自身还不太精晓,也是C#向动态语言过渡的1种试探吧。

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

  这一个主意有多个参数第三个是必选参数,第叁个和第多个是可选参数,他们都有二个默许值。

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

   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”)时会优先实施未有可选参数的法子。

  肆.措施参数之命名参数

  命名参数让我们能够在调用方法时内定参数名字来给参数赋值,那种情景下能够忽略参数的1一。如下方法申明:

  
static void DoSomething(int height, int width, string openerName, string scroll)
主导语法,0第四次全国代表大会新风味代码示例与解读。  {
        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中的八个比较根本的特征。
以前的篇章中,大家曾介…

  一、.net四.0第壹新特色

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

  以前的小说中,大家曾介绍过C#的历史及C# 四.0新添天性,包含:dynamic、
命名和可选参数、动态导入以及协变和逆变等。今天大家构成代码实例来具体看一下C#四.0中的多个相比关键的特色。


  1.dynamic ExpandoObject

  1.dynamic ExpandoObject

       
.Net四.0在.Net叁.5基础上增加产量的重大特征有:可选参数、命名参数和Dynamic。具体请阅鱼生的那篇博文。那里大家任重(Ren Zhong)而道远疏解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#中动用了,前提是将3个变量声明为ExpandoObject类型。如下例:

  未来这几个js动态语言的特色,大家也足以在c#中央银行使了,前提是将2个变量注解为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,这里曾经八九不离10javascript 的var obj ={}; obj.Name
=’lucy’。但又相差一点都不小,因为不能够在clr运维时动态生成属性可能措施。但最少比.NET3.5不甘雌伏了。

  }

  }

 

  C#
四.0中新添了一个命名空间System.Dynamic来达成对此接纳的扶助,那种用法的意思何在,以后自家还不太明了,也是C#向动态语言过渡的1种试探吧。

  C#
四.0中新扩充了叁个命名空间System.Dynamic来落成对此采纳的支撑,那种用法的含义何在,现在本人还不太精通,也是C#向动态语言过渡的一种试探吧。

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

  2.泛型自动转换

  2.泛型自动转换


  在C# 四.0之前上面包车型地铁代码是不能编译通过的

  在C# 四.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#
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还有四个第2的.Net肆.0表征有必不可缺聊起到,那也是本文重点研商的剧情。

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

亚洲必赢官网 1

 

所属方法都以虚方法,大家得以重写这一个虚方法。那里关键看TryInvokeMember()方法。那个办法VS2010交给了详尽的描述。

依据VS2010评释,由于自家的VS20十是英文版的,那里就不贴出英文注释了。简介一下怎么着运用那些点子:倘若大家三个类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#4.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;
}
}

 

     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 {
1二 return “人类是用Talk,而不是Quack”;
13 }
14
}

 

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

1 public static string
DoQuack(dynamic animal)
2 {

  那一个办法有多少个参数第二个是必选参数,第2个和第陆个是可选参数,他们都有一个默许值。

  那些方法有多少个参数第一个是必选参数,第二个和第几个是可选参数,他们都有二个暗中认可值。

3 string result

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

  
4、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
你是还是不是对.Net4.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();
  }

  或然你会想到,假如自个儿有3个和可选参数方法有些参数相同的艺术具名的不二秘技时,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那些艺术有五个参数,可是并未有可选参数,

  那里又重载了3个DoSomething那么些点子有多个参数,然则并未有可选参数,

  实验验证调用DoSomething(壹,”arg”)时会优施夷光行未有可选参数的方法。

  实验求证调用DoSomething(一,”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 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();
  }

  很显明的那是一个语法糖,可是在艺术参数繁多的场地下很有含义,可以追加代码的可读性。

  很显眼的那是四个语法糖,可是在格局参数多数的情形下很有含义,能够追加代码的可读性。

网站地图xml地图