zoukankan      html  css  js  c++  java
  • C# 之 Ref Out

    如下代码:

       static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                var (a, b, c) = ("a","b","c");
                myRef(ref a,out b,c);
                Console.WriteLine(a+b+c);
                Console.ReadKey();
    
            }
    
            static void myRef(ref string a, out string b, string c)
            {
                a = "aaa";
                b = "bbb";
                c = "ccc";
            }
    

      查看IL:

     1     .method private hidebysig static 
     2         void Main (
     3             string[] args
     4         ) cil managed 
     5     {
     6         // Method begins at RVA 0x2050
     7         // Code size 62 (0x3e)
     8         .maxstack 3
     9         .entrypoint
    10         .locals init (
    11             [0] string a,
    12             [1] string b,
    13             [2] string c
    14         )
    15 
    16         // (no C# code)
    17         IL_0000: nop
    18         // Console.WriteLine("Hello World!");
    19         IL_0001: ldstr "Hello World!"
    20         IL_0006: call void [System.Console]System.Console::WriteLine(string)
    21         // (no C# code)
    22         IL_000b: nop
    23         // string a = "a";
    24         IL_000c: ldstr "a"
    25         IL_0011: stloc.0
    26         // string b = "b";
    27         IL_0012: ldstr "b"
    28         IL_0017: stloc.1
    29         // string text = "c";
    30         IL_0018: ldstr "c"
    31         IL_001d: stloc.2
    32         // myRef(ref a, out b, text);
    33         IL_001e: ldloca.s 0
    34         IL_0020: ldloca.s 1
    35         IL_0022: ldloc.2
    36         IL_0023: call void ConsoleApp1.Program::myRef(string&, string&, string)
    37         // (no C# code)
    38         IL_0028: nop
    39         // Console.WriteLine(a + b + text);
    40         IL_0029: ldloc.0
    41         IL_002a: ldloc.1
    42         IL_002b: ldloc.2
    43         IL_002c: call string [System.Runtime]System.String::Concat(string, string, string)
    44         IL_0031: call void [System.Console]System.Console::WriteLine(string)
    45         // (no C# code)
    46         IL_0036: nop
    47         // Console.ReadKey();
    48         IL_0037: call valuetype [System.Console]System.ConsoleKeyInfo [System.Console]System.Console::ReadKey()
    49         IL_003c: pop
    50         // }
    51         IL_003d: ret
    52     } // end of method Program::Main
    View Code

    可以看到,这里ref  和Out 用到了指针。

    最后将对象引用(类型 O)值存储在给定地址 ,Out 在方法上 多了一个 [out]

    气功波(18037675651)
  • 相关阅读:
    Javascript函数声明和函数表达式
    浅谈getAttribute兼容性
    js数组去重的三种常用方法总结
    说说JSON和JSONP,也许你会豁然开朗
    web安全之跨站请求伪造
    javascript中对象的深度克隆
    三种方式实现元素水平居中显示与固定布局和流式布局概念理解
    js dom element 属性整理(原创)
    ul下的li浮动,如何是ul有li的高度
    js数组去重的4个方法
  • 原文地址:https://www.cnblogs.com/qgbo/p/12861823.html
Copyright © 2011-2022 走看看