通常结构体不能进行链式调用,因为返回值是一个新的值,需要赋回原值。但现在通过ref关键字配合扩展方法,也能进行链式调用了。

结构体:

public struct Foo
{
public int a; public Foo AddOne()
{
a++; return this;
} public Foo AddTwo()
{
a += 2; return this;
}
}

执行测试:

Foo foo = new Foo();
foo
.AddOne()
.AddTwo(); Debug.Log(foo.a);//1(错误)

那么借助c#新的ref关键字,我们可以引用返回结构:

public ref Foo AddOne()
{
a++; return ref this;/*ref不能返回this*/
}

但是编译器不能通过,没关系,可以通过扩展方法实现。

扩展方法实现ref返回:

public static class FooExtensions
{
public static ref Foo AddOneRef(this ref Foo foo)
{
foo.AddOne();
return ref foo;
} public static ref Foo AddTwoRef(this ref Foo foo)
{
foo.AddTwo();
return ref foo;
}
}

调用测试:

Foo foo = new Foo();
foo
.AddOneRef()
.AddTwoRef(); Debug.Log(foo.a); //3

可见,结果正确。并且使用ref,函数返回时不会创建新的结构体。

通过ref返回解决C# struct结构体链式调用的问题的更多相关文章

  1. 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组

    一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...

  2. C#语言struct结构体适用场景和注意事项

    在C#语言中struct结构体和class之间的区别主要是值类型和引用类型的区别,但实际上如果使用不当是非常要命的.从Win32时代过来的人对于struct一点不感觉陌生,但是却反而忽略了一些基本问题 ...

  3. go struct结构体

    struct结构体 用来自定义复杂数据结构 struct里面可以包含多个字段(属性),字段可以是任意类型 struct类型可以定义方法,注意和函数的区分 struct类型是值类型 struct类型可以 ...

  4. struct 结构体解析(原)

    (一)基本概念 结构体是一个或是多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组合在一个名字之下.我们将关键字struct引入了结构声明中.结构声明包含在花括号内的一系列声明组成 ...

  5. C# Struct结构体里数组长度的指定

    typedef struct Point{ unsigned short x; unsigned short y; }mPoint;//点坐标 typedef struct Line{ mPoint ...

  6. C语言 Struct 结构体在 Java 中的体现

    大一整个学期完成了 C 语言的学习,大二就进入了Java 的学习. 和C语言一样,我们都会尝试写一个小小的学生管理系统什么的,学习过 C 语言同学知道,在管理系统中 Struct 结构体是个很好用的东 ...

  7. 3.11 Go Struct结构体

    3.11 Go Struct结构体 Golang支持OOP面向对象编程. Go的结构体struct如同python的class. Go基于struct实现OOP特性,只有组合composition这个 ...

  8. C#基础--struct(结构体)

    结构体和类有点类似    我们定义一个类的时候    是class   类名   定义结构体的时候是 struct   结构体名 结构体的写法 struct Point { // public int ...

  9. Swift Struct 结构体

    前言 Swift 语言有两种基本的数据类型,即类(class)和结构体(struct),class 这样的概念大家不会陌生,而 struct 也并不是什么新的概念,在 Objective-C 和 C ...

  10. struct结构体在c和c++中的差别

    非常多次遇到这个struct的问题,今天在这里简单总结一下我的理解 一.struct在C 中的使用 1.单独使用struct定义结构体类型 struct Student { int id; int n ...

随机推荐

  1. #启发式合并,LIS,平衡树#洛谷 4577 [FJOI2018]领导集团问题

    题目 在一棵树上选择最多的点,使得存在祖先关系的点满足\(w_x\leq w_y\),其中\(x\)是\(y\)的祖先 分析 祖先链上要满足\(LIS\),考虑将子节点的LIS序列合并至节点\(x\) ...

  2. 你知道什么叫做API、SDK吗?

    链接:https://www.zhihu.com/question/21691705/answer/770586138 API.SDK是什么......... 讲个小故事: 研发人员A开发了软件A,研 ...

  3. Spring源码 20 手写模拟

    项目地址 https://gitee.com/liao-hang/hand-write-spring.git 模拟 Spring 注解 自动装配 Autowired @Target(ElementTy ...

  4. HarmonyOS Codelab 优秀样例——溪村小镇(ArkTS)

    一.  介绍 溪村小镇是一款展示溪流背坡村园区风貌的应用,包括园区内的导航功能,小火车行车状态查看,以及各区域的风景展览介绍,主要用于展示HarmonyOS的ArkUI能力和动画效果.具体包括如下功能 ...

  5. redis 简单整理——持久化之RDB[十九]

    前言 简单介绍一下redis的持久化.先来整理一下RDB. 正文 redis 支持RDB 和 AOF两种持久化机制,他们能达到的效果不一致. 那么先来看一下RDB吧. RDB 是把当前进程数据生成快照 ...

  6. 论文记载:FRAP:Learning Phase Competition for Traffic Signal Control

    ABSTRACT 一个为早晨的交通训练好的模型可能不适用于下午的交通,因为交通流可能被逆转,导致非常不同的状态表示.本文基于交通信号控制中相位冲突的直观原理,提出了一种新的设计方案FRAP:当两个交通 ...

  7. kubelet 原理分析

    Reference https://atbug.com/kubelet-source-code-analysis/ kubelet 简介 kubernetes 分为控制面和数据面,kubelet 就是 ...

  8. Java集成系列:高效构建自定义插件

    前言 随着软件开发的快速发展和需求的不断增长,开发人员面临着更多的压力和挑战.传统的开发方法需要花费大量的时间和精力,而低代码开发平台的出现为开发人员提供了一种更加高效.快速的开发方式.今天小编就以构 ...

  9. 力扣560(java&python)-和为k的子数组(中等)

    题目: 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 . 示例 1: 输入:nums = [1,1,1], k = 2输出:2示例 2: 输入:n ...

  10. 一文剖析PolarDB HTAP的列存数据压缩

    简介: PolarDB MySQL是阿里云自研的云原生数据库,主要处理在线事务负载(OLTP, OnLine Transactional Processing),深受企业用户的青睐. 前言 数据库迁移 ...