C#vb.net实现多种构造函数和初始化,静态类/普通类
·
Shared Sub New() Private Sub New() Private Sub New(connStr) Public Sub New(connStr) 用C#实现多种构造函数和初始化,静态类,普通类,和VB.NET有哪些区别?
C# 和 VB.NET 在构造函数和类设计上有一些重要的语法和概念差异。我将用 C# 实现与您提供的 VB.NET 代码等效的功能,并详细解释区别。
VB.NET 原始代码
' VB.NET
Public Class ExampleClass
Shared Sub New()
' 共享构造函数
End Sub
Private Sub New()
' 私有无参构造函数
End Sub
Private Sub New(connStr As String)
' 私有有参构造函数
End Sub
Public Sub New(connStr As String)
' 公共有参构造函数
End Sub
End Class
C# 等效实现
1. 普通类(最接近VB.NET的转换)
// C#
public class ExampleClass
{
// 1. 静态构造函数 (等效于 Shared Sub New())
static ExampleClass()
{
Console.WriteLine("静态构造函数执行");
}
// 2. 私有无参构造函数
private ExampleClass()
{
throw new InvalidOperationException("请使用带连接字符串的构造函数");
}
// 3. 私有有参构造函数
private ExampleClass(string connStr)
{
Console.WriteLine($"私有构造函数: {connStr}");
this.ConnectionString = connStr;
}
// 4. 公共有参构造函数 - 必须参数不同!
public ExampleClass(string connStr, int timeout = 30) : this(connStr)
{
// 调用私有构造函数后执行额外逻辑
Console.WriteLine($"公共构造函数,超时: {timeout}");
this.Timeout = timeout;
}
public string ConnectionString { get; }
public int Timeout { get; }
}
2. 静态类(C# 有专门的语法)
// C# - 静态类 (更严格的限制)
public static class StaticUtilityClass
{
// 静态构造函数
static StaticUtilityClass()
{
Console.WriteLine("静态类构造函数执行");
}
// 只能有静态成员
public static string Version { get; } = "1.0";
// 错误:不能在静态类中有实例构造函数
// private StaticUtilityClass() { }
public static void HelperMethod()
{
Console.WriteLine("静态方法");
}
}
3. 单例模式实现
// C# - 单例模式
public sealed class SingletonDatabase
{
// 静态构造函数
static SingletonDatabase()
{
Console.WriteLine("单例类初始化");
}
// 私有无参构造函数
private SingletonDatabase()
{
Console.WriteLine("创建单例实例");
}
// 静态实例
private static readonly SingletonDatabase _instance = new SingletonDatabase();
public static SingletonDatabase Instance => _instance;
public void Query(string sql)
{
Console.WriteLine($"执行查询: {sql}");
}
}
C# 与 VB.NET 的关键区别
1. 静态构造函数语法
| 特性 | VB.NET | C# |
|---|---|---|
| 声明 | Shared Sub New() |
static ClassName() |
| 访问修饰符 | 隐式私有 | 不允许任何访问修饰符 |
| 调用时机 | 第一次使用类前 | 第一次使用类前 |
2. 静态类(Static Class)
| 特性 | VB.NET | C# |
|---|---|---|
| 专用语法 | 无,用 NotInheritable + Private Sub New() 模拟 |
有 static class 关键字 |
| 实例化 | 通过技巧防止 | 编译时禁止 |
| 继承 | 通过 NotInheritable 防止 |
编译时禁止 |
| 成员类型 | 可以包含实例成员(但无法使用) | 只能包含静态成员 |
3. 构造函数重载规则
| 特性 | VB.NET | C# |
|---|---|---|
| 相同签名 | 不允许,无论访问修饰符 | 不允许,无论访问修饰符 |
| 构造函数调用 | Me.New(参数) |
: this(参数) |
| 基类调用 | MyBase.New(参数) |
: base(参数) |
4. 访问修饰符
| 特性 | VB.NET | C# |
|---|---|---|
| 共享/静态成员 | Public Shared |
public static |
| 只读属性 | Public ReadOnly Property |
public readonly property |
| 密封类 | NotInheritable |
sealed |
使用示例对比
VB.NET 使用
' 共享构造函数在第一次访问时自动执行
Dim obj As New ExampleClass("connection_string", 60)
' 静态类用法(模拟)
MathUtils.Add(5, 3)
' 单例用法
Dim db As SingletonDatabase = SingletonDatabase.Instance
C# 使用
// 静态构造函数在第一次访问时自动执行
var obj = new ExampleClass("connection_string", 60);
// 静态类用法(原生支持)
StaticUtilityClass.HelperMethod();
// 单例用法
var db = SingletonDatabase.Instance;
db.Query("SELECT * FROM Users");
重要注意事项
-
C# 的静态类更严格:真正的静态类在编译时 enforced 所有限制
-
构造函数语法:C# 使用
: this()和: base()而不是Me.New()和MyBase.New() -
属性语法:C# 的属性语法更简洁
-
空值处理:C# 有更丰富的空值检查功能(nullable reference types)
-
事件处理:两者的事件语法有较大差异
总结
虽然 C# 和 VB.NET 在 .NET 平台上可以完全互操作,但在语法和某些特性上存在重要区别:
-
C# 有专门的
static class语法,而 VB.NET 需要手动模拟 -
构造函数调用语法不同(
: this()vsMe.New()) -
访问修饰符的关键字不同(
public staticvsPublic Shared) -
C# 的语法通常更简洁,类型推断更强(
var)
选择哪种语言主要取决于团队偏好和项目要求,两者的功能在 .NET 运行时层面是等价的。
更多推荐



所有评论(0)