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");

重要注意事项

  1. C# 的静态类更严格:真正的静态类在编译时 enforced 所有限制

  2. 构造函数语法:C# 使用 : this() 和 : base() 而不是 Me.New() 和 MyBase.New()

  3. 属性语法:C# 的属性语法更简洁

  4. 空值处理:C# 有更丰富的空值检查功能(nullable reference types)

  5. 事件处理:两者的事件语法有较大差异

总结

虽然 C# 和 VB.NET 在 .NET 平台上可以完全互操作,但在语法和某些特性上存在重要区别:

  • C# 有专门的 static class 语法,而 VB.NET 需要手动模拟

  • 构造函数调用语法不同: this() vs Me.New()

  • 访问修饰符的关键字不同public static vs Public Shared

  • C# 的语法通常更简洁,类型推断更强(var

选择哪种语言主要取决于团队偏好和项目要求,两者的功能在 .NET 运行时层面是等价的。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐