是否有包含函数参数的对象?

时间:2013-05-23 09:17:16

标签: c# .net vb.net parameters

在一个方法中,它会滚动离开屏幕。为了让我在编程时更轻松,如果我想引用类的变量,我可以使用Methis对象,具体取决于我使用的语言。

eg. Me.var1 = "Hello"

是否有一个对象(如Me)可以轻松引用函数的参数?

eg. params.par1 = "World"

5 个答案:

答案 0 :(得分:6)

该语言中没有此类功能。局部变量和方法参数由.NET抖动专门处理,它们在运行时严重优化。 .NET会做什么,或者你会做什么来捕获这些变量都会使这种优化失败。

一个非常简单的解决方案是使用Window + Split,它为您提供了两个代码视图。将顶部的一个滚动到方法标题,将代码写在底部。您可以调整分割器,在底部窗口中为您提供更多空间。

利用IntelliSense将是另一种方式。使用一个小字符串作为参数名称的前缀,例如“par”。然后在代码中键入“par”会自动为您提供IntelliSense弹出窗口中的参数名称列表。

然而,这些只是真正问题的创可贴。一旦你发现自己达到这样的目的,你的第一个想法应该是将函数中的代码拆分以使其变小。经过三十年的编码,我发现了一些难以理解的事实:

  • 长方法有更多错误。有一个衡量标准,称为“圈复杂度”。数字越大,代码被破坏的可能性越大。在Visual Studio的支持下,这个blog post很有用。
  • 代码永远不应缩进超过3个级别。到目前为止,最简单的方法是发现你的圈复杂度在没有运行工具的情况下失控。
  • 方法不应大于屏幕上的方法。任何不适合的代码都是一种产生编译错误和错误的认知税。这有一个必然结果,拥有大显示器的程序员会产生更多错误。我使用的硬规则是使用DOS编辑器的灵感,一个方法不应该超过25行代码。
  • 广泛的代码会产生一种特殊的错误,这种错误是你无法看到的。屏幕右侧的任何内容都是代码,可能有一个错误,可能会花费你很长的时间来发现。 VB.NET特别容易出现这种错误,因为它使用行尾作为语句终止符。在VS2010 btw中有很大改进,在很多情况下,下划线现在是可选的。总是打破你的界限以避免这种错误。
  • 提前计划并编写可维护的代码。维护代码永远不会小于原始代码。如果您在编写原始代码时遇到问题,那么根据定义您无法维护它。你必须从小开始。
  • 始终先设计,稍后再编码。在开始编码之前,长方法是不能长时间考虑代码的强有力的指标。除了编写正确的代码之外,它本身就是一个强大的bug诱导器。

答案 1 :(得分:0)

简短的回答是否定的。看起来您希望使用它来区分函数参数和具有相同名称的字段的参数范围和类范围,遗憾的是您不能。使用不同的命名方案,或执行以下操作:

public class MyClass {
  private string myString;
  private int myInt;
  public MyClass(string myString) {
    this.myString = myString;
  }
  public int DoStuff(int myInt) {
    this.myInt += myInt;
    return this.myInt;
  }
}

要非常清楚并避免出现问题,您可以更改名称:

public class MyClass {
  private string m_myString;
  private int m_myInt;
  public MyClass(string myString) {
    m_myString = myString;
  }
  public int DoStuff(int myInt) {
    m_myInt += myInt;
    return m_myInt;
  }
}

你应该首先在代码之前编写测试,然后你可以检查你的代码中是否有意外混淆了。

<强>脚注

我包括这个,因为来到这个问题标题的人可能正在寻找以下信息。

当你说

  

为了便于编程 - 如果我在一个函数中走了很长一段路,我想看看有什么参数而不必向上滚动

如果你真的想从代码中查看你的参数是出于其他原因那么你需要反思。这很慢,它的典型用途是找到一个方法,然后反映该方法中的参数。有关非常全面的示例,请参阅MSDN - ParameterInfo Class。代码的相关部分是:

foreach (MemberInfo mi in typeof(MyClass).GetMembers() )
{
  // If the member is a method, display information about its parameters. 
  if (mi.MemberType==MemberTypes.Method)
  {
  foreach ( ParameterInfo pi in ((MethodInfo) mi).GetParameters() )
  {
    Console.WriteLine("Parameter: Type={0}, Name={1}", pi.ParameterType, pi.Name);
  }
}

答案 2 :(得分:0)

您应该能够使用GetParameters()反射方法

MethodInfo barMI = bar.GetMethod("Foo");
ParameterInfo[] pars = barMI.GetParameters();
foreach (ParameterInfo p in pars) 
{
    Console.WriteLine(p.Name);
}

您可以在运行时使用它。但是为了你的目标,我会尝试重构函数及其名称的数量。我尝试将代码长度保持在每行80个符号以下,并将类中的行数保持在100以下。这并不总是可行的,但这是一个很好的目标,可以解耦并简化类。

答案 3 :(得分:0)

一种简单的方法是将您的参数封装在一个对象中,这样您就可以引用它,而intellitype(或任何预测功能)会向您显示您可用的属性,而无需向上滚动。喜欢这个

public class MyParamObject{
    public string FirstParam {get;set;}
    public string SecondParam {get;set;}
}

然后你可以从

改变你的方法
public void MyReallyOvergrownMethod(string firstParam, string secondParam){...

public void MyReallyOvergrownMethod(MyParamObject params){...

然后你可以在方法

中使用这样的params参数
//Deep inside the method
if(params.FirstParam == "SomeValue"{//Do something

这是解决问题的一个简单解决方案,通过重构您的方法可以最好地解决这个问题。查看循环和条件,并将它们分成独立的私有方法,这些方法以它们的命名命名。如果您搜索cleancoders,就会有大量内容。

答案 4 :(得分:0)

根据你的评论“只是为了方便编程 - 如果我在一个函数中很长一段时间我想看看有什么参数而不必向上滚动”:在Visual Studio中,代码显示,只是在滚动条上方有一点你可以抓住并拉下来拆分窗口。然后,您可以在一个窗格中显示您的函数声明,并在另一个窗格中滚动任意多个。或者您可以使用窗口菜单 - >分割。