使用泛型元组替代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 ...
随机推荐
- vim添加或删除多行注释
一.多行注释的添加 1. vim的命令模式下(ESC 进入命令模式): 2. 按CTRL+V进入可视化模式(VISUAL BLOCK): 注意:vim命令模式下v进入的是visual模式,ctrl+v ...
- IOS Socket 04-利用框架CocoaAsyncSocket实现客户端/服务器端
这篇文章,我们介绍CocoaAsyncSocket框架的使用,主要介绍实现客户端/服务器端代码,相信在网上已经很多这样的文章了,这里做一下自己的总结.这里介绍使用GCD方式 一.客户端 1.下载地址 ...
- Linux下chkconfig命令详解 这个简单明了啊
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...
- Yii2框架RESTful API教程(二) - 格式化响应,授权认证和速率限制
之前写过一篇Yii2框架RESTful API教程(一) - 快速入门,今天接着来探究一下Yii2 RESTful的格式化响应,授权认证和速率限制三个部分 一.目录结构 先列出需要改动的文件.目录如下 ...
- 每天一个linux命令(38):cal 命令
cal命令可以用来显示公历(阳历)日历.公历是现在国际通用的历法,又称格列历,通称阳历."阳历"又名"太阳历",系以地球绕行太阳一周为一年,为西方各国所通用,故 ...
- 快速入门系列--MVC--02路由
现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯.通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性.可读性.SEO优化.接下来 ...
- Script Task 引用 package variable
Script Task 能够使用C#代码进行编程,许多复杂的逻辑都可以使用C# 脚本来实现,不仅灵活,而且强大. 1,能够传递package variable 给 Script Task ,并且Scr ...
- 关于OnEraseBkgnd和OnPaint的转载
问题是这样产生的.在OnEraseBkGnd中,如果你不调用原来缺省的OnEraseBkGnd只是重画背景则不会有闪烁.而在OnPaint里面, 由于它隐含的调用了OnEraseBkGnd,而你又没有 ...
- Android引导页设计
大家在安装好一个应用后,第一次打开时往往会出现一个使用引导页,形式一般为三.四张图片,随着我们的滑动进行切换,在最后一页会有一个进入应用的按钮,我们通过点击这个按钮可以进入应用,其实这其中没有太多的复 ...
- Angular从0到1:function(下)
1.前言 2.function(下) 2.13.angular.isArray(★★) angular.isArray用于判断对象是不是数组,等价于Array.isArray console.log( ...