.NET“.NET研究” 4.0 之 Dynamic 动态类型

简介:   一、.NET4.0主要新特性  .NET4.0在.Net3.5基础上新增的主要特性有:可选参数、命名参数和Dynamic。具体请阅生鱼片的这篇博文。这里我们着重讲解C#4.0的Dynamic特性,对于其他特性大家可以在VS2010内尝试一下。

  一、.NET4.0主要新特性

  .NET4.0在.Net3.5基础上新增的主要特性有:可选参数、命名参数和Dynamic。具体请阅生鱼片的这篇博文。这里我们着重讲解C#4.0的Dynamic特性,对于其他特性大家可以在VS2010内尝试一下。总之.Net在不断进步中。

  二、ExpandoObject普通应用

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

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

  输出<< Lucy20True,这里已经类似javascript 的var obj ={}; obj.Name ='lucy'。但又不完全相同,因上海网站建设为不能在clr运行时动态生成属性或者方法。但至少比.NET3.5先进了。

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

  1.前不久看过这么一段代码:

static class Calculator
{    
public static T Add < T > (T t1, T t2) {        
dynamic d1
= t1;        
dynamic d2
上海企业网站设计与制作pan style="color: #000000;">= t2;        
return (T)(d1
+ d2);    
   }
}
public static void Main( string [] args){  
  
int i = Calculator.Add( 1 , 2 );    
  
double d = Calculator.Add( 1.1 , 2.2 );    
  
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 命名空间下。在VS2010内就可以看见该类的成员列表,截图如下:

1

  所属方法都是虚方法,我们可以重写这些虚方法。这里主要看TryInvokeMember()方法。这个方法VS2010给出了详细的描述。  

  根据VS2010注释,由于我的VS2010是英文版的,这里就不贴出英文注释了。简单介绍一下如何使用这个方法:假设我们一个类OurClass它继承了DynamicObject 这个Class。OurClass中有一个方法OurMethod()。接着在OurClass 类中 重写 TryInvokeMember这个基类虚方法。以上设置完后以后只要OurClass 的OurMethod方法一旦被调用都先执行一下重写后的

  TryInvokeMember()方法。也许您会问这样到底有何用途?OK!请先看javascript这段代码片段:

   function tryInvokeMember(obj) {
            
if (obj && typeof obj.ourMethod === " function " ) {
                 return obj.ourMethod();
             }
            alert(
' 未找到!');
            return null ;
         }
  
         var ourObj1
= {};
         ourObj1.Method
= function () {
            alert(
' 111');
         };

         var ourObj2

= {};
         ourObj2.ourMethod
= function () {
             alert(
' 已经找到ourMethod并且执行');
         };

         tryInvokeMember(ourObj1);
         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:

public class Duck : DynamicAnimal
     {
        
public string Quack()
         {
            return
" 鸭子嘛,就Quack吧! " ;
         }
     }
  
public class Human : DynamicAnimal
     {
        
public string Talk()
         {
             return
" 人类是用Talk,而不是Quack " ;
         }
     }

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

public static string DoQuack(dynamic animal)
         {
            
string result = animal.Quack();
             return result ??
" ...人类当然不会鸭叫... " ;
         }

  4、Console 内 Main方法调用:

static void Main( string [] args)
         {
             var duck
= new Duck();
             var cow
= 上海闵行企业网站制作"color: #000000;"> new Human();
             Console.WriteLine(
" 鸭子是Quack " );
             Console.WriteLine(DoQua上海闵行企业网站设计与制作ck(duck));
             Console.WriteLine(
" 人类是talk上海徐汇企业网站制作 " );
             Console.WriteLine(DoQuack(cow));
             Console.ReadKey();        
}

  程序执行结果如下:

1

  您是否对.Net4.0 Dynamic 这个动态类型有了一个新的认识呢?

目录
相关文章
|
3月前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
98 7
|
3月前
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
|
4月前
|
开发框架 .NET API
.NET Core 和 .NET 标准类库项目类型有什么区别?
在 Visual Studio 中,可创建三种类库:.NET Framework、.NET Standard 和 .NET Core。.NET Standard 是规范,确保跨.NET实现的API一致性,适用于代码共享。.NET Framework 用于特定技术,如旧版支持。.NET Core 库允许访问更多API但限制兼容性。选择取决于兼容性和所需API:需要广泛兼容性时用.NET Standard,需要更多API时用.NET Core。.NET Standard 替代了 PCL,促进多平台共享代码。
|
5月前
|
机器学习/深度学习 JSON 测试技术
CNN依旧能战:nnU-Net团队新研究揭示医学图像分割的验证误区,设定先进的验证标准与基线模型
在3D医学图像分割领域,尽管出现了多种新架构和方法,但大多未能超越2018年nnU-Net基准。研究发现,许多新方法的优越性未经严格验证,揭示了验证方法的不严谨性。作者通过系统基准测试评估了CNN、Transformer和Mamba等方法,强调了配置和硬件资源的重要性,并更新了nnU-Net基线以适应不同条件。论文呼吁加强科学验证,以确保真实性能提升。通过nnU-Net的变体和新方法的比较,显示经典CNN方法在某些情况下仍优于理论上的先进方法。研究提供了新的标准化基线模型,以促进更严谨的性能评估。
143 0
|
6月前
|
安全 API C#
C#.Net筑基-类型系统②常见类型--枚举Enum
枚举(enum)是C#中的一种值类型,用于创建一组命名的整数常量。它们基于整数类型(如int、byte等),默认为int。枚举成员可指定值,未指定则从0开始自动递增。默认值为0。枚举可以与整数类型互相转换,并可通过`[Flags]`特性表示位域,支持位操作,用于多选场景。`System.Enum`类提供了如`HasFlag`、`GetName`等方法进行枚举操作。
|
6月前
|
编译器 C#
C#.Net筑基-类型系统②常见类型 --record是什么类型?
`record`在C#中是一种创建简单、只读数据结构的方式,常用于轻量级数据传输。它本质上是类(默认)或结构体的快捷形式,包含自动生成的属性、`Equals`、`ToString`、解构赋值等方法。记录类型可以继承其他record或接口,但不继承普通类。支持使用`with`语句创建副本。例如,`public record User(string Name, int Age)`会被编译为包含属性、相等比较和`ToString()`等方法的类。记录类型提供了解构赋值和自定义实现,如密封的`sealed`记录,防止子类重写。
|
6月前
|
存储 C#
C#.Net筑基-类型系统②常见类型--结构体类型Struct
本文介绍了C#中的结构体(struct)是一种用户自定义的值类型,适用于定义简单数据结构。结构体可以有构造函数,能定义字段、属性和方法,但不能有终结器或继承其他类。它们在栈上分配,参数传递为值传递,但在类成员或包含引用类型字段时例外。文章还提到了`readonly struct`和`ref struct`,前者要求所有字段为只读,后者强制结构体存储在栈上,适用于高性能场景,如Span和ReadOnlySpan。
|
6月前
|
存储 安全 Unix
C#.Net筑基-类型系统②常见类型--日期和时间的故事
在System命名空间中,有几种表示日期时间的不可变结构体(Struct):DateTime、DateTimeOffset、TimeSpan、DateOnly和TimeOnly。DateTime包含当前本地或UTC时间,以及最小和最大值;DateTimeOffset增加了时区偏移信息,适合跨时区操作。UTC是世界标准时间,而格林尼治标准时间(GMT)不稳定,已被更精确的UTC取代。DateTimeOffset和DateTime提供了转换为UTC和本地时间的方法,以及各种解析和格式化函数。
|
5月前
|
存储 编译器
【.NET Core】可为null类型详解
【.NET Core】可为null类型详解
210 0
|
6月前
|
机器学习/深度学习 算法 数据可视化
MATLAB基于深度学习U-net神经网络模型的能谱CT的基物质分解技术研究
MATLAB基于深度学习U-net神经网络模型的能谱CT的基物质分解技术研究
下一篇
无影云桌面