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#高手知道这个:-)
谢谢
访问类中的静态方法需要包含所有者类
obj.FooField = General.NullToEmpty(dr["Foo"])
我的经验是你有几个选择:
1)将实用程序函数嵌入到所有其他类继承的基类中。这不是一个实际的解决方案,因为你可能会有从第三方或。net框架类继承的类,这将是非常难以修改的。
2)使用扩展方法将你的功能扩展到现有的基类。我认为这最终会比它的价值更多的工作。
3)创建一个非常简单命名的全局方法holder类(例如Util),并在你的方法前面加上这个hold名。
我们使用选项3将一个大型的VB应用程序转换为c#,它运行得非常好。虽然它不像VB语法那么方便,但是一旦你习惯了它,它就会变得非常容易使用。
VB。NET将模块中的方法添加到全局(未命名)命名空间。这主要是一个反向比较功能,如果团队可以删除模块支持,那么他们可能会这样做。但是他们不能这样做,因为这样做会使将VB6代码移植到VB.NET中变得非常困难。这种做法是不确定的,根本无法扩展,当项目变大时,你往往会遇到麻烦。这个问题被称为"全局命名空间污染"。
程序员倾向于通过给方法名一个前缀来解决这个问题。这是有效的,但很尴尬,因为你必须咳出前缀,每次你想调用该方法,没有类似的进口指令。智能感知也受到很大的影响。c#根本不允许这样做。最接近的方法是使用扩展方法。但是不要习惯c#的方式。