簡體   English   中英

C#靜態類與VB.NET模塊的使用

[英]C# Static Class vs VB.NET Module usage

我很難以類似於從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");

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#專家必須知道這一點:-)

謝謝

在類中訪問靜態方法要求您包括所有者類

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

我的經驗是您有幾種選擇:

1)將實用程序功能嵌入所有其他類都繼承的基類中。 這實際上不是一個實際的解決方案,因為您可能會有從第三方或.Net框架類繼承的類,這將很難修改。

2)使用擴展方法將您的功能擴展到現有的基類。 我認為這最終將花費更多的精力。

3)創建一個非常簡單的全局方法所有者類(即Util),並使用該保留名稱作為方法的前綴。

我們使用選項3將大型VB應用程序轉換為C#,並且效果很好。 盡管它不像VB語法那樣方便,但是一旦習慣了,它就變得非常容易使用。

VB.NET將模塊中的方法添加到全局(未命名)名稱空間。 這主要是反向兼容功能,如果團隊可以刪除模塊支持,那么他們可能會這樣做。 但是他們不能,將VB6代碼移植到VB.NET太困難了。 這種做法很不穩定,根本無法擴展,當項目規模很大時,您往往會遇到麻煩。 一個稱為“全局名稱空間污染”的問題。

程序員傾向於通過給方法名稱加上前綴來解決它。 哪個可行,但是很尷尬,因為每次您要調用該方法時都必須咳嗽那個前綴,對此沒有與Imports指令類似的東西。 IntelliSense也遭受很大的痛苦。

C#根本不允許這樣做。 您最能得到的就是擴展方法。 但是,請不要習慣C#方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM