【问题标题】:VB.NET to C# conversion, default parameter valuesVB.NET到C#的转换,默认参数值
【发布时间】:2012-03-03 21:55:10
【问题描述】:

我正在将一个大型 VB.Net 项目转换为 C#。我使用免费的自动化工具来转换它们。 VB 对传入的空参数很满意,并使用方法定义中提供的默认值。 转换后,C#代码中有很多调用如下所示:

GetElement(ndFirst, WAIT_AFTER_BATCH,false, , , "WAIT");

而且编译器不高兴...

如果我可以在拨打电话时自动编辑 C# 文件(因为智能感知知道如何)以填充这些默认值,有人可以指出我正确的方向吗?

【问题讨论】:

  • 空参数使用null即可。
  • 您是在寻找一个遵循一般 C# 约定的好答案,还是只是一种使其工作的方法?
  • 我需要让它开始工作。解决方案非常大,我需要很长时间去编辑每个方法调用以填充默认参数。这就是我问这个问题的原因。而且我不能只对所有空参数使用 null,例如对于布尔参数...
  • 涉及哪个版本的 Visual Studio? 2010 年?
  • 我正在使用 VS 2010 Professional。

标签: c# default-value optional-parameters vb.net-to-c#


【解决方案1】:

我假设您的方法的 C# 版本具有正确指定的默认参数,例如。

public void SomeMethod(int paramA = 0, int paramB = 1, int paramC = 2){
   ...
}

如果您想调用该方法并接受 paramB 的默认值(如您的示例中所示),那么您需要命名参数

SomeMethod(paramA: 12, paramC: 20);

这将收集 paramA 和 paramC 的值,同时使用 paramB 的默认值。

此外,由于 paramA 的位置正确,这也是正确的

SomeMethod(12, paramC: 20);

或者,如果您要省略的参数是最后一个参数,您可以简单地将其省略并像这样调用您的方法

SomeMethod(12,20);

其中 paramA = 12、paramB = 20 和 paramC 将使用默认值 2。

很遗憾,我不知道有一种自动解决这些问题的方法。同样,为了加快速度,您可以使用 ReSharper 并创建一个格式化程序来强制使用命名参数。然后在您的项目上运行一个简单的正则表达式并清除所有 ',,' 的实例

注意 我与 JetBrains 或 ReSharper 没有任何关系。我只是这家公司的客户。

【讨论】:

    【解决方案2】:

    当我从 VB.Net 转到 C#.Net 时,我也有过这种经历

    这就是你要做的:

    1. 首先导入InteropServicesNameSpace

      using System.Runtime.InteropServices;
      
    2. 然后创建一个如下所示的函数或过程:(在我的情况下它是一个函数)

      static string ResizeImage(string imgTemp,
                                [Optional, DefaultParameterValue(200)] int xLength)
      {
         // Do something HERE
      }
      

    【讨论】:

      【解决方案3】:
      1. 我修复了为公共库生成的 cs 文件中的编译器错误
      2. 编写了一个实用程序来检查文件中的方法定义,并在字典中准备了方法和 ParamterInfos 的目录。

         var methodInfos = type.GetMethods(BindingFlags.Public | BindingFlags.Static);
                //this is not exact for methods with different signatures.
                foreach (var methodInfo in methodInfos)
                {
                    if(!methodCatalog.ContainsKey(methodInfo.Name)) 
                        methodCatalog.Add(methodInfo.Name, methodInfo.GetParameters());
                    else
                    {
        
                        methodCatalog.Add(methodInfo.Name + "__" + Guid.NewGuid() , methodInfo.GetParameters());
                    }
                }
        
      3. 写了另一个方法,我为方法调用标记一行获取方法参数(它们都是“,”分隔)

      4. 对于空参数值,我从方法字典中设置值

            for(int i = 0; i < paramValues.Length; i++)
            {
                if(  string.IsNullOrEmpty( paramValues[i].Trim()) )
                {
                    paramValues[i] = currentParameterInfos[i].DefaultValue.ToString();
                }
            } 
        
      5. 这很容易出错,但比进入文件并手动编辑要好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 2012-10-11
        • 2010-10-26
        • 2012-07-05
        • 2020-11-19
        • 1970-01-01
        • 2020-02-25
        相关资源
        最近更新 更多