如何使用参数并以C#返回?

如何使用参数并以C#返回?,c#,types,parameters,return,C#,Types,Parameters,Return,就我的一生而言,我看过的每一篇教程,看过的每一段视频,读过的每一本书,我都无法理解这些东西到底是如何工作的 我看到通过值传递值,通过引用传递值,通过值传递引用,通过引用传递引用。有人能用最基本的例子帮助我理解这些吗 关于退货类型,同样的问题。它们是如何工作的?在这方面你能找到的最好的资源是Jon Skeet。它给出了一个非常清楚的解释。如果在阅读之后你仍然有问题,你应该试着问得更具体一些,这样更容易帮助你 你能在这本书上找到的最好的资源是Jon Skeet。它给出了一个非常清楚的解释。如果在阅读

就我的一生而言,我看过的每一篇教程,看过的每一段视频,读过的每一本书,我都无法理解这些东西到底是如何工作的

我看到通过值传递值,通过引用传递值,通过值传递引用,通过引用传递引用。有人能用最基本的例子帮助我理解这些吗


关于退货类型,同样的问题。它们是如何工作的?

在这方面你能找到的最好的资源是Jon Skeet。它给出了一个非常清楚的解释。如果在阅读之后你仍然有问题,你应该试着问得更具体一些,这样更容易帮助你

你能在这本书上找到的最好的资源是Jon Skeet。它给出了一个非常清楚的解释。如果在阅读之后你仍然有问题,你应该试着问得更具体一些,这样更容易帮助你

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

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

在.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

输出仍然是“1”和“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

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

首先,您只看到按值传递或按引用传递。没有别的了。 现在要理解这个概念,假设您有一组数字框,标记为1、2、3、4等。这些框包含一些数据。 然后想象你有一张纸的清单,上面写着同样的东西,也就是一个索引,有1,2,3,4

现在,您希望将框中的一个内容(数据)传递给您的朋友。 你可以用这两种方法中的一种

  • 按值传递 你的朋友检查你的盒子,然后把它复制到他的盒子/硬盘上。假设您的朋友需要更改此数据。如果他这样做,您的原始框不会受到影响,因为他更改了框中的数据

  • 参照传递 你只要把盒子的地址给你的朋友,你的朋友就会使用你的盒子而不是复制它。如果他修改了数据,它将来自您的框,您的原始数据将被更改


  • 在理解返回类型之前,必须理解数据类型。从这里开始。

    首先,您只看到按值传递或按引用传递。没有别的了。 现在要理解这个概念,假设您有一组数字框,标记为1、2、3、4等。这些框包含一些数据。 然后想象你有一张纸的清单,上面写着同样的东西,也就是一个索引,有1,2,3,4

    现在,您希望将框中的一个内容(数据)传递给您的朋友。 你可以用这两种方法中的一种

  • 按值传递 你的朋友检查你的盒子,然后把它复制到他的盒子/硬盘上。假设您的朋友需要更改此数据。如果他这样做,您的原始框不会受到影响,因为他更改了框中的数据

  • 参照传递 你只要把盒子的地址给你的朋友,你的朋友就会使用你的盒子而不是复制它。如果他修改了数据,它将来自您的框,您的原始数据将被更改


  • 在理解返回类型之前,必须理解数据类型。从这里开始。

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