人妻少妇精品久久久久久蜜臀av,久久综合激激的五月天,日韩精品无码专区免费播放,欧美精品999

ref(熱風)

前沿拓展:

ref

一、第一,打開Excel表格程序,進入到程序主界面中,可以看到單元格中的“#REF!”出現問題。

二、第二,選中出現“#REF”的單元格,可以看到是引用了表格2中數據所以出現問題。

三、第二,在左下角將表格切換到表格2“sheet2”,

四、第二,在表格2中看到,A1單元格有問題。

五、第二,選中A1單元格,發(fā)現錯誤的公式。

六、第二,在函數欄修改A3單元格的數值。

七、最后,回到表格一,可以看到#REF消失,問題解決。


自從 C# 7.3 放開 ref 之后,這玩法就太花哨了,也讓 C# 這門語言變得越來越多范式,越來越重,這篇我們就來聊聊 ref,本質上來說 ref 的放開就是把 C/C++ 指針的那一套又拿回來了,而且還封裝成一套自己的玩法,下面一一解讀下。

一:方法參數上的 ref

我想設計者的初心把 ref 的功能限制的****的,可能也考慮到 C# 是一門面向業(yè)務開發(fā)的語言,講究的是做項目快狠準,性能反而不是第一要素,這個時候的 ref 很簡單,看一下代碼:

class Program
{
static void Main(string[] args)
{
long price = 0;

GetPrice(ref price);

Console.WriteLine(#34;output: price={price}");
}

public static void GetPrice(ref long price)
{
price = 10;
}
}

output: price=10

我相信很有朋友都知道,方法參數中的 ref long price 拿的是棧地址,對棧地址上的值進行修改,自然就修改了指向這些地址上的變量,和引用類型原理一致,接下來我們從匯編角度去驗證,在 Price 方法上下一個斷點。

D:net5ConsoleApp4ConsoleApp3Program.cs @ 16:
026b048e 8d4dec lea ecx,[ebp-14h]
026b0491 ff15a0ebc800 call dword ptr ds:[0C8EBA0h] (ConsoleApp3.Program.GetPrice(Int64 ByRef), mdToken: 06000002)
026b0497 90 nop
0:000> bp 026b0491
0:000> g
Breakpoint 1 hit
ChangeEngineState
eax=00000000 ebx=0057f354 ecx=0057f2d4 edx=783aaa50 esi=02979e7c edi=0057f2dc
eip=026b0491 esp=0057f2c4 ebp=0057f2e8 iopl=0 nv up ei pl zr na pe nc
cs=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 方法,后續(xù)的賦值將會影響這個棧位置 上的內容。

2. 方法返回值上的 ref

這就有意思了,進入的時候傳地址,回來的時候也想傳地址,很顯然方法線程棧上的 值類型 是傳不出去的,畢竟方法返回后,esp,ebp 所控制的方法棧幀空間是要銷毀的,所以只能是堆上對象才能實現。

為了方便理解,看如下代碼:

class Program
{
static void Main(string[] args)
{
ref long price = ref GetCurrentPrice();

price = 12;

Console.WriteLine(#34;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 Size
027ca7b0 04c39d00 36

Statistics:
MT Count TotalSize Class Name
04c39d00 1 36 System.Int64[]
Total 1 objects
0:000> dq 027ca7b0 L4
027ca7b0 00000003`04c39d00 00000000`0000000a
027ca7c0 00000000`0000000c 00000000`0000001e

可以看到上面的 000000000000000c 被修改成 price=12 ,這時候有人就不爽了,我不希望外面的代碼能修改 price 內容,那怎么辦呢? 還得在 ref 后面加上 readonly ,改造后如下:

ref(熱風)

到此時寫法就有點瘋狂了,對 C# 開發(fā)者來說很難理解,對熟悉 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;
}

說實話,這代碼看起來就清爽多了。

2. 對 ref 變量的 in **作

這又是一套 C/C++ 的玩法,有時候不希望某一個方法對 ref 變量進行修改,注意:是不希望某一個方法進行修改,其他方法是可以的,那這個怎么實現呢?這就需要在入參上加 in 前綴,把代碼修改一下。

class Program
{
static void Main(string[] args)
{
ref long price = ref GetCurrentPrice();

ModifyPrice(in price);

Console.WriteLine(#34;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);
}
}

ref(熱風)

可以看到,這時候報錯了,如果換成 C++ 就很簡單了,只需要在參數上把 in 改成 const 即可。

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

ref(熱風)

文章來自https://www.cnblogs.com/huangxincheng/p/16188769.html

拓展知識:

ref

ref是reference的縮寫,意思是“參照”,外貿函電中常見于Your ref No. or Our ref No.,其含義是你方來函編號(或我方)來函編號,是函電格式的一部分,目的是為了告知對方本信是答復你方(或我方)前面的來函

本回答被網友采納

原創(chuàng)文章,作者:九賢生活小編,如若轉載,請注明出處:http://m.xiesong.cn/97403.html

中文字幕色停停| 性色AV无码久久久久久免| 黄页在线观看视频| 色天使色天使天堂影院| 久久男人的天堂视频| 日本不卡在线视频二区三区| 国产XXXXWW| 青青草色鬼在线| 打工女人内毛片| 日本边做边吃奶AⅤ视频免费| 国产免费成人黄片| 中文无码日必操视频道| 久久亚洲精品五码国产| 污污网站免费在线观看| 亚洲日韩中文字幕| 自慰网站免费进入| 国产一区二区夜袭AV| 神马香蕉久久| 网站国产| 亚洲无码中文字幕精品| 国产91夜夜操| 二区无码三区| 亚洲精品乱码久久久久久蜜桃| 天天爽天天射| 亚洲AV学生妹| 六月天色网站| 亚洲国产黄片一区二区| 高清国产av一区二区三区| 日本在线精品视频| 久久久天堂射| 婬乱欧美大片免费观看| 成人动作片国产| 永久免费AV无码网站04| 国模小黎视频| 粉嫩AV在线成人动漫| 轻轻干轻轻艹| 99电影| 疯狂添女人下部视频免费| selulu在线| 欧美变态另类sm灌奶| 丝袜美腿 二区|