使用泛型元组替代out与ref形式传参
我们在开发的时候,都会常常遇到一个问题,如何为逻辑上返回多个对象设计方法签名。通常我们会想到使用out或ref修饰参数,或者麻烦些自己设定一个类型内部包含多个Object类型属性来接收多个返回值。这两中方式都不够好,前者让程序难以实现多态(out或ref修饰的参数类型,不能使用派生类替代),设计走向是面向过程,也难以使用链式编程;后者因为所有的返回都Object类型,所以在使用时都要进行转换成真实的类型。在这种情况下我们可以使用泛型元组类型来处。在.Net 4.0中新增了Tuple与Tuple<T1>、Tuple<T1,T2>、Tuple<T1,......,T7,TRest>。就解决了上面的问题。
其泛型元组可以更好的处理4种情况:
①替代out与ref修饰的参数(即方法含有多个返回值)。
②通过单个参数将多个值传递给一个方法。例如, Thread.Start(Object) 方法有一个单一参数,可以使用该参数向在启动时线程执行的方法提供一个值。
③提供对数据集的轻松访问和操作。如一条数据(Tuple)中含有多个子数据(Tuple中属性),多条记录合并成了数据集(类型为Tuple的集合)。
④表示一组数据。例如,元组可以表示数据库中的一条记录,并且其属性可以表示该记录的字段。
如下:展示了一个泛型Tuple的声明
public class Tuple<T1, T2, T3> : IStructuralEquatable, IStructuralComparable, IComparable
{
public Tuple(T1 item1, T2 item2, T3 item3);
public T1 Item1 { get; }
public T2 Item2 { get; }
public T3 Item3 { get; }
//省略方法的具体实现
public override bool Equals(object obj);
public override int GetHashCode();
public override string ToString();
//省略对借口的实现
}
在.Net4.0以下的版本虽然没有框架自带的泛型元组,但是我们可以自己定义泛型元组(代码结构如上),其类型中的比较与相等的接口也可以根据需要是否实现。
如下分别为out或ref修饰参数使用、泛型元组Tuple<T1,T2>的使用
public static float TemperatureOfCity(string cityId, out string cityName)
{
//省略数据处理内容
cityName = "腾冲";
float temperature = 23.6f;
return temperature;
}
public static Tuple<string, float> TemperatureOfCity(string cityId)
{
//省略数据处理内容
string cityName = "腾冲";
float temperature = 23.6f;
return new Tuple<string, float>(cityName, temperature);
}
可能你并不希望此类Tuple的定义扰乱了类型的真正含义,好在C#的设计者也考略到这个问题,允许我们使用using语句为任意的封闭泛型类型声明一个别名。
using CityTemperature = Tuple<string, float>;
public static Tuple<string, float> TemperatureOfCity(string cityId)
{
//省略数据处理内容
string cityName = "腾冲";
float temperature = 23.6f;
return new CityTemperature(cityName, temperature);
}
以上虽然只详细的列出了泛型元组处理的4中情况的(替代out或ref参数)一种,但是其他3中情况的代码编写都是类似。就不一一明细列出。
使用泛型元组替代out与ref形式传参的更多相关文章
- angular2 post以“application/x-www-form-urlencoded”形式传参的解决办法
angular2 post以“application/x-www-form-urlencoded”形式传参的解决办法 http://blog.csdn.net/tianjun2012/article/ ...
- mybatis-plus 自定义SQL,XML形式,传参的几种方式
mybatis-plus 自定义SQL,XML形式,传参的几种方式 前提说明 所涉及文件 传参类型说明 1.Java代码中使用QueryWrapper动态拼装SQL 2.简单类型参数(如String, ...
- C# 中传参中的OUT 和 ref 区别 笔记
//out传参前需要对参数进行赋值处理,ref则不需要.//out.ref 传参都可以对值进行改变 1 static void Main(string[] args) { ; //int J = 10 ...
- 前台的url通过 ActionName?var1=xx&var2=yy 的形式传给特定action
本文对自己开发的基于lucene和J2EE技术的搜索引擎开发经验进行简单总结.今后可能会从性能的角度总结lucene开发经验.当数据上TB级别后,分布式lucene以及结合分布式文件系统(如HDFS) ...
- urlencode($url):把url转义,当字符串数据以url的形式传递给web服务器时,字符串中是不允许出现空格和特殊字符串的
1.对url进行编码转义
- ref以及传值传址的理解
ref(也包括out)关键字肯定都会用,传值调用和传址调用也是初学写代码时都已经历过的话题,与这相关的还有一些话题,比如值类型和引用类型有什么区别等,但是如果不仔细,可能有一些概念的混淆或者理解不够清 ...
- java泛型-泛型类,泛型接口,常用形式
泛型简单使用: package com.etc; import java.util.ArrayList; import java.util.List; /* 泛型就相当于<>一个标签,泛化 ...
- C# Attribute特性 泛型<T> 方法的out ref this(扩展方法) Equals与==
out ref out和ref的使用场景其实不一样.out适合在方法内返回一个额外的结果参数,而ref适合直接改变一个在方法外面的值,方法改变外部就改变,无需重新定义接住返回值再使用. out可以在方 ...
- 用泛型T替代object做为万能参数传递
using System;using System.Collections;using System.Collections.Generic;using UnityEngine; public cla ...
随机推荐
- 基于Css反射形自触发事件,优化你的延时事件
昨天听w3ctech分享时候,说道orientationchange在不同OS和版本中,存在兼容问题,很多时候触发时候都没有渲染结束,开发同学一般都是基于setTimeout一段时间之后,在去执行具体 ...
- 实现基于Task的异步模式
返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的方法都是异步方法,编 ...
- PHP数据库操作:使用ORM
之前我发了一篇博文PHP数据库操作:从MySQL原生API到PDO,向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对象.PDO操作MySQL数据库的.本文介绍如 ...
- struts2学习笔记之八:Action中方法的动态调用
方法一:action名称+!+方法名称+后缀 Action类中增加addUser()和delUser()方法, package com.djoker.struts2; import org.apach ...
- java基础 数组14
已知2个一维数组:a[]={3,4,5,6,7},b[]={1,2,3,4,5,6,7}:把数组a与数组b 对应的元素乘积再赋值给数组b,如:b[2]=a[2]*b[2]:最后输出数组b的元素.
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-myba ...
- 谷毅(WingKu)横空出世
天空划出一道彩虹,谷毅(WingKu)横空出世,这里的产品全由本人开发制作,如有雷同不胜荣幸,欢迎前往下载使用,如果有啥建议或者使用当中遇到什么问题,也可在此留言评论~OK,开张啦~!以后每个产品会以 ...
- Python的闭包
Python的闭包 闭包概念都是一样的,实现机制一样,看看下面的代码是不是和javascript很像 def generate_counter(): cnt = [0] def count_one() ...
- JTMz换路径导致MySQL服务不能启动的问题
问题: JTMz解压到我的机器上,运行一次后,把服务停止了,然后移到了另外一个路径,JTMz中自带的MySQL服务启动不起来了. 解决: 在注册表中修改 HKEY_LOCAL_MACHINE\SYST ...
- JavaScript的陷阱
这本来是翻译Estelle Weyl的<15 JavaScript Gotchas>,里面介绍的都是在JavaScript编程实践中平时容易出错或需要注意的地方,并提供避开这些陷阱的方法, ...