当前位置: 首页 > news >正文

跟京东类似的网站西安电商平台网站建设

跟京东类似的网站,西安电商平台网站建设,如皋做公司网站,公司品牌logo设计本质上来说 ref 的就是把 C/C 指针的那一套又拿回来了,而且还封装成一套自己的玩法。 我想设计者的初心把 ref 的功能限制得死死的,可能也考虑到 C# 是一门面向业务开发的语言,讲究的是做项目快狠准,性能反而不是第一要素&#x…

本质上来说 ref 的就是把 C/C++ 指针的那一套又拿回来了,而且还封装成一套自己的玩法。

我想设计者的初心把 ref 的功能限制得死死的,可能也考虑到 C# 是一门面向业务开发的语言,讲究的是做项目快狠准,性能反而不是第一要素,这个时候的 ref 很简单,看一下代码:

class Program
{static void Main(string[] args){long price = 0;GetPrice(ref price);Console.WriteLine($"output: price={price}");}public static void GetPrice(ref long price){price = 10;} } 
// output: price=10

我相信大家都知道,方法参数中ref long price拿的是栈中的地址,对栈地址上的值进行修改,地址上的变量会被修改,和引用类型原理一致,接下来咋就从汇编的角度去看看。

D:\net5\ConsoleApp4\ConsoleApp3\Program.cs @ 16:026b048e 8d4declea     ecx,[ebp-14h]026b0491 ff15a0ebc800    call    dword ptr ds:[0C8EBA0h] (ConsoleApp3.Program.GetPrice(Int64 ByRef), mdToken:06000002)026b0497 90              nop0:000> bp 026b04910:000> gBreakpoint 1 hitChangeEngineStateeax=00000000 ebx=0057f354 ecx=0057f2d4 edx=783aaa50 esi=02979e7c edi=0057f2dceip=026b0491 esp=0057f2c4 ebp=0057f2e8 iopl=0         nv up ei pl zr na pe nccs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
026b0491 ff15a0ebc800    call    dword ptr ds:[0C8EBA0h] ds:002b:00c8eba0=00c2be10

从汇编的lea ecx,[ebp-14h]就能看到,将ebp-14这个单元的内存地址给了 ecx,这个 ecx 也就是作为参数传递给了Price方法,后续的赋值将会影响这个栈位置上的内容。

方法返回值上的 ref

这就有意思了,进入的时候传地址,回来的时候也想传地址,很显然方法线程栈上的 值类型 是传不出去的,毕竟方法返回后,esp,ebp 所控制的方法栈帧空间是要销毁的,所以只能是堆上对象才能实现。
为了方便理解,看如下代码:

class Program
{static void Main(string[] args){ref long price = ref TaskClass.GetCurrentPrice();price = 12;Console.WriteLine($"output: price={price}");}public static ref long GetCurrentPrice(){long[] nums = { 10, 20, 30 };return ref nums[1];}} 
// output: price=12

可以看到当前的price=12,同时nums这个数组也被修改了,可以用 windbg 验证一下。

0:000> !dumpheap  -type System.Int64[]Address       MT     Size027ca7b0 04c39d00       36Statistics:MT    Count    TotalSize Class Name04c39d00        136 System.Int64[]Total 1 objects0:000> dq 027ca7b0 L4027ca7b0  00000003`04c39d00 00000000`0000000a027ca7c0  00000000`0000000c 00000000`0000001e

可以看到上面的000000000000000c被修改成price=12,这时候有人就不爽了,我不希望外面的代码能修改 price 内容,那怎么办呢? 还得在ref后面加上readonly,改造后如下:

添加图片注释,不超过 140 字(可选)

到此时写法就有点疯狂了,对 C# 开发者来说很难理解,对熟悉 C/C++ 指针的朋友来说又很不习惯,太纠结了,下面是一段翻译过来的C/C++指针代码。

const long long* getcurrentprice();int main()
{int i = 0;const long long* price = getcurrentprice();price = 12;printf("num=%d, price=%d \n", i, *price);}const long long* getcurrentprice() {long long* num = new long long[3]{ 10,20,30 };return num + 1;
}

对 ref 变量的 in 操作

这又是一套 C/C++ 的玩法,有时候不希望某一个方法对 ref 变量进行修改,注意:是不希望某一个方法进行修改,其他方法是可以的,那这个怎么实现呢?这就需要在入参上加in前缀,把代码修改一下。

class Program
{static void Main(string[] args){ref long price = ref GetCurrentPrice();ModifyPrice(in price);Console.WriteLine($"output: price={price}");}public static ref long GetCurrentPrice(){long[] nums = { 10, 20, 30 };return ref nums[1];}public static void ModifyPrice(in long price){price = 12;Console.WriteLine(price);}
}

在这里插入图片描述

可以看到,这时候报错了,如果换成 C++ 就很简单了,只需要在参数上把 in 改成 const 即可。

void modifyprice(const long long* price) {*price = 12;printf("%d", *price);
}

添加图片注释,不超过 140 字(可选)

总的来说,ref 这一套玩法太另类了,按实际需求使用,不太会去考虑性能方面的问题。

http://www.yayakq.cn/news/815045/

相关文章:

  • 新手如何做网站创意设计服务是什么
  • 观澜小学网站建设wordpress数据库访问优化
  • 东营网站建设优化seo怎么去优化
  • 国外免费推广网站免费自己建网站
  • 网站开发用什么语言比较流行wordpress 查看用户密码
  • 给领导发网站建设可行性方案邮件怎么写中铁建设集团内网登录
  • 网站建设网上商城厦门建设局公维金网站
  • 临安建设规划局网站仪表东莞网站建设
  • 株洲网站排名优化价格搜狗推广做网站要钱吗
  • 东莞南城网站制作公司贵州住房和建设厅网站
  • 网站建设合同中英文模板网站开发未按合同约定开发时间完工
  • 营销型网站要素企业微信小程序制作
  • 资源下载站wordpress主题怎么查有做网站的公司
  • php做网站麻烦吗wordpress直播平台
  • 建站塔山双喜专业做招聘网站
  • 关注江苏建设厅网站南阳高质量建设大城市网站
  • 网站上的图片做多大站长工具黄
  • 成都官方网站建设中小型企业网站优化案例
  • 营销型网站设计如何免费发布广告
  • 网站主页面布局怎么做互联网企业有哪些行业
  • 如何在网站做qq群链接seo网站优化推广怎么做
  • 襄阳万家灯火网站建设保险网站源码
  • 网站逻辑结构优化是指c 网站开发 readonly属性
  • 做营销型网站需要注意哪些点百度后台管理
  • 在线设计签名免费网站做购物网站骗人
  • 企业网站的设计与实现论文163 com免费邮箱注册
  • 网站建设责任分工wordpress添加友情链接页面
  • 中国响应式网站建设免费电商网站建设
  • seo网站优化服务商移动排名提升软件
  • 番禺做网站服务最新新闻国内大事件