C# 【无法修改XX返回值,因为它不是变量】

using UnityEngine;
using System.Collections;
using System.Xml.Linq;
using UnityEditor;
using System;public class NewBehaviourScript : MonoBehaviour {struct MVec3{public float x;public float y;public float z;}class CTest{public MVec3 posx;public MVec3 pos { set; get; }//等同于下面的写法->/*MVec3 dv = new MVec3 ();public MVec3 pos{set{ dv = value; }get{ return dv;}}*/}CTest otest;// Use this for initializationvoid Start () {otest = new CTest ();otest.pos.x = 10;otest.posx.x = 123;gameObject.transform.position.x = 10;Debug.Log ("ot.pos.x={0}" + otest.posx.x);}// Update is called once per framevoid Update () {Vector3 vec3 = gameObject.transform.position;}
}

编译时出现如下错误:

可以看到34行和36行都出现了编译错误,而35行则正确编译。原因分析:

C#中,reference类型变量存储在堆上,value类型存储在栈上。pos, posx, position都是值类型,为什么会有不同的编译结果呢。区别在于 pos, position是属性,posx是字段。具体分析如下:

32行:new了一个引用类型CTest的对像otest,这时在堆上为对象分配了一片内存,内存大小为pos的三个float和posx的三个float。

34行:由于pos是一个属性,otest.pos将调用属性的get方法,方法的调用是使用栈来进行的,get方法在栈上分配一个临时变量temp来返回pos的的值。即otest.pos返回了一个分配在栈上的临时变量的地址,而otest.pos.x = 10则是试图对栈上临时变量的X进行赋值。这个操作并非不合法,然而是没有意义的,于是编译器就阻止了我们的这个无意义操作,以避免隐患。同理36行。

明白了这个,就容易理解35行为什么是正确的了。otest.posx是一个正常的取地址操作,表示取出otest所在堆内存中的posx变量的地址,这个地址是对象的堆内存中的。

otest.posx.x = 10则是修改堆内存中posx的x的值。

posted on 2016-10-04 21:12 时空观察者9号 阅读(...) 评论(...) 编辑 收藏

C# 【无法修改XX返回值,因为它不是变量】相关推荐

  1. C# struct的陷阱:无法修改“...”的返回值,因为它不是变量

    Cannot modify the return value of 'expression' because it is not a variable 无法修改"expression&quo ...

  2. golang 对字符串按照长度划分,每隔固定长度增加一个指定字符,传参修改对比返回值修改的典型优势

    func split(key string,temp *string){if len(key)<=64 {*temp = *temp+key+"\n"}for i:=0;i& ...

  3. chrome插件 修改接口返回值

    谷歌浏览器插件:修改接口响应.重定向以及拦截url 西凉的悲伤 于 2021-11-05 09:35:33 发布 1338  收藏 5 分类专栏: 工具 文章标签: 浏览器 浏览器插件 url拦截 接 ...

  4. idea 自动补全返回值,自动补全变量名称和属性名称

    这种时候我们想快速补全返回值和对象,直接点击 ctrl + alt + v 便可

  5. ajax请求成功后返回值如何赋值给js变量

    var msg = "" $.ajax({type:"POST",url :"ajax/checkArray.php",data:" ...

  6. 教大家用Xposed,findAndHookMethod方法修改第三方应用方法返回值

    Xposed框架,功能强大,可以修改静态变量,修改方法返回值 现在我就教大家怎么利用Xposed框架,修改第三方应用方法返回值 一般我们都会用反编译软件,查找到想要模拟的方法. 例如:我要模拟的viv ...

  7. try-catch-finally对返回值的影响

    catch 和 finally 一起使用的常见方式是:在 try 块中获取并使用资源,在 catch 块中处理异常情况,并在 finally 块中释放资源. finally 块用于清理try块分配的任 ...

  8. androidstudio返回之前界面_charles 如何修改服务器返回内容 - Breakpoints

    测试过程中经常需要测试不同的界面显示,比如名字太长.特殊符号显示,一方面可以通过修改源数据实现,比如数据库中修改电影名,但是这样的话首先比较麻烦,需要进行数据库操作:其次,修改完之后会影响其他人的工作 ...

  9. ostream作为函数返回值_Go语言入门必知教程-函数

    函数是为了执行特定任务而存在于程序内的一组语句,函数接受输入并返回输出. 函数允许将常用的代码块提取出来成为单个组件. 使用最广的Go函数是main(),每个独立的Go程序都必须有个main函数. 创 ...

最新文章

  1. 各种主流 SQLServer 迁移到 MySQL 工具对比
  2. DNS 流程说明以及相关问题的解析
  3. boost::hana::mod用法的测试程序
  4. 浙江省计算机二级(C语言)通过经验+资料
  5. 工作总结16:多看官网
  6. 再见安卓 你好鸿蒙,安卓,再见!你好,鸿蒙系统!
  7. 开源 sql 代码提示工具_有关如何计划开源活动的提示
  8. c if标签怎么用android,android – 使用NDK将YUV解码为C/C++中的RGB
  9. (转)AssetBundle系列——共享资源打包/依赖资源打包
  10. MRFC-概念与功能
  11. caffe学习日记--lesson3:win8系统,VS2013下的caffe工程编译探究
  12. 数据挖掘10大算法(1)——PageRank
  13. 对php的感受100字_【php实训心得】php心得体会
  14. java jvm学习笔记三(class文件检验器)
  15. windows中文件夹打包成Jar包 cmd命令
  16. 虚拟串口软件VSPD下载安装及使用 包含XCOM串口调试软件
  17. python3通过request多进程获取驾校一点通试题库
  18. 基于MATLAB的混沌密码与数字图像加密应用、信息隐藏
  19. 22湖南大学计算机学硕上岸经验
  20. python Process, Pipo进程池管道的理解

热门文章

  1. Docker中操作镜像和容器的常用命令
  2. CentOS中Jenkins的下载、安装、配置与启动(图文教程)
  3. Windows上卸载SqlServer数据库
  4. 计算机网络总结:第四章 网络层
  5. 一个跨国银行的敏捷转型案例要点之Agile Center
  6. flutter的安装与设置
  7. flutter项目迁移空安全
  8. matlab偶极矩电场强度分布图_1.2.10 电介质在外电场下的极化、电极化强度、电极化率...
  9. CEO 赠书 | 决策是一个技术活,如何做「对」的事?
  10. 策小编脑中的“私有化部署”