【问题标题】:How do I use parameters and return in C#?如何在 C# 中使用参数和返回?
【发布时间】:2011-08-25 09:12:21
【问题描述】:

在我的一生中,我浏览的每一个教程,我看过的每一个视频,我读过的每一本书,我都无法理解这些东西究竟是如何工作的。

我看到按值传递值、按引用传递值、按值引用、按引用传递。有人可以通过最基本的示例帮助我理解这些吗?

关于返回类型的同样问题。它们是如何工作的?

【问题讨论】:

    标签: c# types parameters return


    【解决方案1】:

    您将在此找到的最佳资源是 Jon Skeet 的 Parameter passing in C#。它给出了非常明确的解释。如果在阅读后您仍有疑问,您应该尝试更具体地询问他们,以便更容易为您提供帮助。

    【讨论】:

    • 人们一直告诉我要更具体地问,但我不明白“告诉我如何以最基本的方式使用这些东西”并不具体>_>
    • @Bill:问题是你的问题有点像问“我如何在代数中使用变量?” -- 这是一个简单的问题,但它有一个不太简单的答案,这种类型的网站不太适合。
    【解决方案2】:

    让我们稍微备份一下,从变量开始。

    变量总是包含一些特定的信息。对于值类型,包含的信息直接是整个值。对于引用类型,包含的信息只是对实际值所在的其他一些内存位置的引用。

    在 .Net 中,您可以假装变量仅以一种方式真正传递给函数或从函数返回:按值。现在忘记通过引用传递——它只会让事情变得混乱。当您按值传递变量时,变量直接持有的全部信息复制到函数中。诀窍在于理解这对引用类型意味着什么,那就是获取引用的副本。

    我可以用一个简单的代码示例来演示:

    void Test(int x, dynamic y)
    {
        x = 3; 
        y.a = "four";
        y.b = "five";
        y = new {a = "six", b = "seven"}; // this will have no effect outside the function
    }
    
    int x = 2; // value type
    var y = new {a = "one", b="two"}; //reference type
    
    // both x and y are passed by value, but y is a reference type so the reference itself is copied
    Test(x, y);
    
    Console.WriteLine(x);  //writes 2, because the test function is working with a copy
    Console.WriteLine(y.a); //writes four
    Console.WriteLine(y.b); //writes five
    

    在引用类型的情况下,您可以强制执行真正的“按引用传递”,但您永远不应该这样做,除非您真的知道发生了什么。看起来像这样:

    void Test(ref dynamic y)
    {
       y = new {a = "three", b="four"};
    }
    
    var y = new {a = "one", b="two"};
    Test(y);
    
    Console.WriteLine(y.a); //prints one
    Console.WriteLine(y.b); //prints two
    

    输出仍然是“一”和“二”,因为函数替换了局部变量的引用。调用该函数的代码仍然具有对原始内存位置的引用,因此输出原始值。

    【讨论】:

    • 你可以假装一切都是按值传递的,但是你不得不忽略一些非常有用的东西。
    • 是的。我想我错过了一个隐含的“现在”。
    【解决方案3】:

    首先,您只看到按值传递或按引用传递。没有别的。 现在要理解这个概念,假设您有一组标记为 1、2、3、4 等的数字框。这些框包含一些数据。 然后想象你有一个陈述相同内容的论文列表,即具有 1、2、3、4 的索引。

    现在您想将盒子的其中一个内容(数据)传递给您的朋友。 您可以通过以下两种方式之一进行操作。

    1. 按值传递 您的朋友检查您的盒子,并将其复制到他的盒子/硬盘中。假设您的朋友需要更改此数据。如果他这样做了,你原来的盒子不会受到影响,因为他改变了他盒子里的数据。

    2. 通过引用传递 您只需将盒子的地址提供给您的朋友,您的朋友就会使用您的盒子而不是复制它。如果他修改数据,它会从你的盒子里,你的原始数据会被改变。

    在了解返回类型之前,您必须了解数据类型。从那里开始。

    【讨论】:

    • 我知道引用更改了原始值,而值使用了副本。我认为我的问题只是,我只是不确定如何使用它们/何时使用它们。
    • 始终使用按值传递。在您更擅长编程之后保存通过引用传递。了解数据类型、一些编程和函数。您必须从基础开始。
    • 同意Zen 先生的观点,我什至不知道.net 框架中的一种方法甚至使用通过引用传递。在大多数情况下,您传递给方法的内容会返回一些完全不相关的内容。如果出现问题,添加按引用传递可能会使调试变得更加困难。几乎感觉就像通过引用添加传递删除了该方法的封装
    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多