[英]What, if any, difference is there between a C# static class and a VB.NET Module
[英]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.