c#静态类vs VB.. NET模块用法

本文关键字:模块 用法 NET VB 静态类 vs | 更新日期: 2023-09-27 18:14:16

我很难从c#类中调用函数,就像我从VB中调用函数一样。净模块。

我有一个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");
vs:

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

或整数转换:

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

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

一定有c#高手知道这个:-)

谢谢

c#静态类vs VB.. NET模块用法

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

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

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

1)将实用程序函数嵌入到所有其他类继承的基类中。这不是一个实际的解决方案,因为你可能会有从第三方或。net框架类继承的类,这将是非常难以修改的。

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

3)创建一个非常简单命名的全局方法holder类(例如Util),并在你的方法前面加上这个hold名。

我们使用选项3将一个大型的VB应用程序转换为c#,它运行得非常好。虽然它不像VB语法那么方便,但是一旦你习惯了它,它就会变得非常容易使用。

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

程序员倾向于通过给方法名一个前缀来解决这个问题。这是有效的,但很尴尬,因为你必须咳出前缀,每次你想调用该方法,没有类似的进口指令。智能感知也受到很大的影响。

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