2

我很难以与从 VB.NET 模块调用函数类似的方式从 C# 类调用函数。

我有一个 C# 类 General.cs

  using System;

  namespace XYZ.Classes
     {
     public static class General
     {
         //Object Null to Empty Function
         public static string NullToEmpty(object obj)
         {
             var returnString = "";
             if (obj != null)
             {
                 returnString = obj.ToString();
             }
             return returnString;
         }

     }
  }

这种类型的函数可以在项目中的任何地方在 VB.NET 中调用,而无需声明模块或为调用添加前缀 - 只需使用

  dim x as String = NullToEmpty(obj) - VB.NET

  var x = NullToEmpty(obj) - C#

从我的谷歌搜索来看,似乎具有公共静态方法的公共静态类可能能够在 C# 中完成此操作。

C# 示例:

类 foo.cs

  namespace XYZ.Classes
  {
      public class Foo
      {

          public string doFoo()
          {
               var obj = null;
               var foolish = NullToEmpty(obj);
               return foolish;
          }
       }
   }

该函数显示在智能感知中(使用 ReSharper) - 但它无效(红色),因此没有正确引用某些内容 - 我只是在猜测......

关键是能够简单地使用常见的“用户定义”实用程序函数来进行空捕获、格式化等... - 这样就不必将各种东西包装在丑陋的 C# 代码中,如下所示:

  obj.FooField = dr["Foo"] == null ? "" : dr["Foo"];

更喜欢:

  obj.FooField = NullToEmpty(dr["Foo"]);

这对于 DateTime 应用程序变得更加有用:

  obj.ActivityStartDate = dr["ActivityStartDate"] == null ? "" : Convert.ToDateTime(dr["ActivityStartDate"]).ToString("yyyy-MM-dd HH:mm:ss");

与:

  obj.ActivityStartDate = GetDate(dr["ActivityStartDate"]);

或整数转换:

  cmd.Parameters["@BirthdayDay"].Value = String.IsNullOrEmpty(obj.BirthdayDay) ? 01 : Convert.ToInt32(obj.BirthdayDay);

与:

  cmd.Parameters["@BirthdayDay"].Value = NullToZero(dr["obj.BirthdayDay"]);

一些 C# 大师必须知道这一点:-)

谢谢

4

3 回答 3

2

访问类中的静态方法需要包含所有者类

obj.FooField = General.NullToEmpty(dr["Foo"])

于 2013-05-19T22:43:43.250 回答
1

VB.NET 将模块中的方法添加到全局(未命名)命名空间。这主要是一个向后兼容的功能,如果团队可以删除模块支持,那么他们可能会这样做。但他们不能,这会使将 VB6 代码移植到 VB.NET 变得非常困难。这种做法很不稳定,根本无法扩展,当项目变大时,你往往会遇到麻烦。一个称为“全局命名空间污染”的问题。

程序员倾向于通过给方法名称一个前缀来解决它。哪个有效,但很尴尬,因为每次要调用该方法时都必须咳出该前缀,因此没有 Imports 指令的类似物。IntelliSense 也深受其害。

C# 根本不允许这样做。最接近的是扩展方法。但是不要,习惯 C# 方式。

于 2013-05-20T00:29:59.583 回答
1

我的经验是你有几个选择:

1) 将实用程序函数嵌入到所有其他类都继承自的基类中。这不是一个真正实用的解决方案,因为您可能会有从第三方或 .Net 框架类继承的类,这将很难修改。

2) 使用扩展方法将您的功能扩展到现有的基类。我认为这最终会比它的价值更多的工作。

3) 制作一个名称非常简单的全局方法持有者类(即 Util),并在您的方法前加上这个持有名称。

我们使用选项 3 将大型 VB 应用程序转换为 C#,并且效果很好。虽然它不像 VB 语法那样方便,但一旦你习惯了它,它就会变得非常容易使用。

于 2013-05-19T22:46:53.450 回答