显式引用一个参数
Posted
技术标签:
【中文标题】显式引用一个参数【英文标题】:Explicitly refer to a parameter 【发布时间】:2011-09-15 15:01:48 【问题描述】:如何显式引用参数而不是成员变量?
static recursive
public static List<string> output = new List<string>();
public static void Recursive(List<string> output)
...
【问题讨论】:
我认为这在递归函数范围内会模棱两可。更改参数名称 仅仅因为你可以做某事并不意味着你应该 - 使用不同的变量名,否则这会很混乱。 我同意这是模棱两可的,但这只是一个例子来说明我在寻找什么。 【参考方案1】:非限定引用将始终引用参数,因为它位于更局部的范围内。
如果你想引用成员变量,你需要用类名来限定它(或this
,对于非静态成员变量)。
output = foo; // refers to the parameter
recursive.output = foo; // refers to a static member variable
this.output = foo; // refers to a non-static member variable
但无论如何,您可能应该更改名称。它使您的代码更易于阅读。
而且您根本不应该有公共静态变量。所有 .NET 编码风格指南都强烈推荐 properties 而不是公开公共字段。而且由于这些总是驼峰式的,所以这个问题自己解决了。
【讨论】:
在这种情况下这是不可能的,因为它是静态的。【参考方案2】:public class MyClass
public int number = 15;
public void DoSomething(int number)
Console.WriteLine(this.number); // prints value of "MyClass.number"
Console.WriteLine(number); // prints value of "number" parameter
编辑::
对于静态字段,需要类名而不是“this”:
public class MyClass
public static int number = 15;
public void DoSomething(int number)
Console.WriteLine(this.number); // prints value of "MyClass.number"
Console.WriteLine(MyClass.number); // prints value of "number" parameter
【讨论】:
topicstarter 在静态上下文中,所以静态是不可能的。 @Frederik Gheysels:你错了。有办法 - 看看我的编辑部分。【参考方案3】:public static void Recursive(List<string> output)
...
块中引用output
的代码将始终是本地的,而不是成员变量。
如果你想引用成员变量,你可以使用recursive.output
。
【讨论】:
【参考方案4】:当你在Recursive
静态方法里面时output
会指向方法的参数。如果要指向静态字段,请使用静态类的名称作为前缀:recursive.output
【讨论】:
【参考方案5】:给你的成员变量另一个名字。 惯例是对公共静态成员使用 Camelcasing。
public static List<string> Output = new List<string>();
public static void Recursive( List<string> output )
Output = output;
【讨论】:
那不是camelCasing,那是PascalCasing。【参考方案6】:您可以显式引用recursive.output
来指示静态成员,但重命名参数或成员会更简洁。
【讨论】:
【参考方案7】:我不知道如何显式引用参数。通常处理这种情况的方式是给成员变量一个特殊的前缀,例如_
或m_
,这样参数就不会具有完全相同的名称。另一种方法是使用 this.var 引用成员变量。
【讨论】:
以上是关于显式引用一个参数的主要内容,如果未能解决你的问题,请参考以下文章
PHP是不是优化数组类型的函数参数,而不是通过引用显式传递,当它们没有被修改时?